10毫秒C++执行时间
我试图找出2e6跳转的“for循环”的确切执行时间。 下面的代码在从g ++编译为C++文件后的10ms内运行。 人们告诉我,这是由C++编译器自动完成的优化代码,所以你 得到毫无意义的执行时间。换句话说,因为没有任何输出呼叫 如printf或COUT < <变量A,B,C这样的优化代码将用于 做什么,“for循环”,这就是为什么我真的很短的编程执行时间在10ms内。对 ?他们为什么说时间结果对于“for循环”是没有意义的。10毫秒C++执行时间
请告知
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;
}
编译器可以以任何不会改变任何可观察的方式改变程序,即所有输出等必须为,正好与未优化代码的输出相同。在您的例子中,编译器可能会注意到,从未使用过的a
,b
和c
循环之后的值,循环就没有别的,所以还不如从你的程序中删除循环。
它也可以观察到的变量值直接依赖于max
,只是跳过所有,但最后一次迭代。
在这两种情况下,结果将不依赖于max
。它仍然没有意义,只是意味着你低估了你的编译器。
编辑:
我测试了此方案与g++ -O2
,循环得到彻底清除,并且不运行在所有。
什么是-O2选项?如何在没有优化的情况下编译它,以便我可以看到优化与非优化之间的时间差异? – aabb 2014-09-01 11:30:38
http://stackoverflow.com/questions/668103/how-to-tell-compiler-to-not-optimize-certain-code-away链接被提及优化 – aabb 2014-09-01 11:52:55
对不起,它是2e6不是2e8,当我改变(非选择代码:最大= 2e6-> 10ms,最大= 2e8-.1000ms)和(优化代码:最大= 2e6-> 4ms,最大= 2e8-> 400ms),最大速度从2e6到2e8, ,但结果不能证明“for循环”操作是否正在执行 – aabb 2014-09-01 12:02:57
运行时是绝对不无意义。它至少证明了一个重要的观点:优化器比信誉更聪明,并且能够推断出循环没有副作用,所以它将其切断。
所以即使配置文件的结果只能证明这一点,但它确实具有意义。
为了解决你想要什么:
我试图找出个“for循环”与2E8 iteritions确切的执行时间。
一个for
环与2e8
执行时间可以是0
如果没有可观察到的影响。或者如果他们是非常大的。这就是为什么你通常使用专用工具来分析实际代码。
请参见[装配输出](http://goo.gl/HDSOiv)。 – 2014-09-01 11:17:43
编译器确实可以完全清除循环,如果它可以证明它没有副作用(就像你的例子)。我不明白你对'please advise'的期望。建议...什么? – bolov 2014-09-01 11:19:29
您可以声明'c'变量,以强制其值在每次迭代时被计算和分配。我不知道这个结果是多少有些没有意义。 – 2014-09-01 12:02:09