我试着找出" for loop"的确切执行时间。与2e6 iteritions。 从g ++ for c ++文件编译后,在10ms内运行以下代码。 人们告诉我,这是由C ++编译器自动完成的优化代码所以你 无意义的执行时间。换句话说,因为没有任何输出调用 例如printf或cout<<对于变量a,b,c,优化的代码将无效 " for循环"这就是为什么我在10ms内完成了很短的程序执行时间。对 ?为什么他们说时间结果对于#34; 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;
}
答案 0 :(得分:4)
运行时绝对不无意义。它至少证明了一个重要的一点:优化器比给定的信用更聪明,并且它能够推断出循环没有副作用,因此它将其切断。
所以,即使简介结果只能证明这一点,它确实有意义。
要解决你想要的问题:
我试着找出2e8 iteritions的“for loop”的确切执行时间。
如果没有可观察到的效果,for
2e8
循环的执行时间可以是0
。或者如果它们非常大。这就是您通常使用专用工具分析实际代码的原因。
答案 1 :(得分:2)
编译器可以以任何不会改变任何可观察的方式更改程序,即所有输出等必须与未优化代码的输出完全相同。在您的示例中,编译器可能会注意到循环之后的a
,b
和c
的值从未使用过,并且循环不会执行任何其他操作,因此它也可以删除循环来自你的计划。
它还可以观察到变量的值直接取决于max
,并且只跳过除最后一次迭代之外的所有变量。
在这两种情况下,结果都不依赖于max
。它仍然没有意义,它只是意味着你低估了你的编译器。
修改强>
我用g++ -O2
测试了这个场景,循环被完全删除,根本不运行。