我试图找出使用2e6项的"for循环“的确切执行时间。从g++为c++文件编译后,以下代码在10 is内运行。人们告诉我,优化代码是由C++编译器自动完成的,因此您得到了没有意义的执行时间。换句话说,由于变量a、b、c没有任何输出调用(如printf或cout<< ),所以优化的代码不会对"for循环“做任何操作,这就是为什么我在10 is内有很短的程序执行时间的原因。对吧?为什么他们说时间结果对"for循环“毫无意义。
请指教
int main(){
int max = 2e6;
int a,b,c;
// CODE YOU WANT TO TIME
int start = getMilliCount();
for (int i = 0; i < max; i++) {
a = 1234 + 5678 + i;
b = 1234 * 5678 + i;
c=1234/2+i;
}
int milliSecondsElapsed = getMilliSpan(start);
printf("\n\nElapsed time = %u milliseconds %d\n", milliSecondsElapsed,max);
return 0;
}发布于 2014-09-01 11:18:26
编译器可以以不改变任何可观察到的东西的任何方式改变程序,即所有输出等必须与未优化代码的输出完全相同。在您的示例中,编译器可能会注意到,循环后的a、b和c的值从未被使用过,并且循环没有做任何其他事情,所以它最好将循环从程序中删除。
它还可以观察到变量的值直接依赖于max,并且只跳过最后一次迭代以外的所有迭代。
在这两种情况下,结果都不取决于max。它仍然不是毫无意义的,它只是意味着你低估了你的编译器。
编辑:
我用g++ -O2测试了这个场景,循环被完全删除,根本不运行。
发布于 2014-09-01 11:17:00
运行时绝对是,而不是。这至少证明了一个重要的问题:优化器比给定的信用更聪明,而且它能够推断出循环没有副作用,所以它把它去掉了。
因此,即使配置文件的结果仅仅证明了这一点,它也是有意义的。
要解决你想要的:
我试图找出使用2e8项的"for循环“的确切执行时间。
如果没有可观察到的效果,for循环与2e8的执行时间可以是0。或者非常大,如果是的话。这就是为什么通常使用专用工具来分析实际代码的原因。
https://stackoverflow.com/questions/25604514
复制相似问题