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; 
} 
+2

请参见[装配输出](http://goo.gl/HDSOiv)。 – 2014-09-01 11:17:43

+1

编译器确实可以完全清除循环,如果它可以证明它没有副作用(就像你的例子)。我不明白你对'please advise'的期望。建议...什么? – bolov 2014-09-01 11:19:29

+0

您可以声明'c'变量,以强制其值在每次迭代时被计算和分配。我不知道这个结果是多少有些没有意义。 – 2014-09-01 12:02:09

编译器可以以任何不会改变任何可观察的方式改变程序,即所有输出等必须为,正好与未优化代码的输出相同。在您的例子中,编译器可能会注意到,从未使用过的abc循环之后的值,循环就没有别的,所以还不如从你的程序中删除循环。

它也可以观察到的变量值直接依赖于max,只是跳过所有,但最后一次迭代。

在这两种情况下,结果将不依赖于max。它仍然没有意义,只是意味着你低估了你的编译器。

编辑:

我测试了此方案与g++ -O2,循环得到彻底清除,并且不运行在所有。

+0

什么是-O2选项?如何在没有优化的情况下编译它,以便我可以看到优化与非优化之间的时间差异? – aabb 2014-09-01 11:30:38

+0

http://stackoverflow.com/questions/668103/how-to-tell-compiler-to-not-optimize-certain-code-away链接被提及优化 – aabb 2014-09-01 11:52:55

+0

对不起,它是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如果没有可观察到的影响。或者如果他们是非常大的。这就是为什么你通常使用专用工具来分析实际代码。

+0

所以,实际上,在for循环必须运行在程序exe文件2E8 iteritions,对不对?所以这是循环实时10ms – aabb 2014-09-01 11:19:45

+0

@aabb我没有这么说。 for循环可能根本不运行。 – 2014-09-01 11:20:13

+0

由于main()中没有其他调用或函数来调用变量a,b,c。所以如果编译器足够聪明,优化代码可以不包括来自“fop loop”的代码,对吧?如果是这样,那就是为什么我得到了10ms对于“for循环”执行时间毫无意义的原因,请告知 – aabb 2014-09-01 11:22:36