10毫秒C ++执行时间

时间:2014-09-01 11:09:55

标签: c++

我试着找出" 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;
}

2 个答案:

答案 0 :(得分:4)

运行时绝对无意义。它至少证明了一个重要的一点:优化器比给定的信用更聪明,并且它能够推断出循环没有副作用,因此它将其切断。

所以,即使简介结果只能证明这一点,它确实有意义。

要解决你想要的问题:

  

我试着找出2e8 iteritions的“for loop”的确切执行时间。

如果没有可观察到的效果,for 2e8循环的执行时间可以是0。或者如果它们非常大。这就是您通常使用专用工具分析实际代码的原因。

答案 1 :(得分:2)

编译器可以以任何不会改变任何可观察的方式更改程序,即所有输出等必须与未优化代码的输出完全相同。在您的示例中,编译器可能会注意到循环之后的abc的值从未使用过,并且循环不会执行任何其他操作,因此它也可以删除循环来自你的计划。

它还可以观察到变量的值直接取决于max,并且只跳过除最后一次迭代之外的所有变量。

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

修改

我用g++ -O2测试了这个场景,循环被完全删除,根本不运行。