10毫秒的C++执行时间

10 milli-second C++ excution time

本文关键字:执行时间 C++ 10毫      更新时间:2023-10-16

我试图通过2e6迭代来找出"for循环"的确切执行时间。以下代码在从g++编译用于c++文件后的10ms内运行。人们告诉我,这是C++编译器自动完成的优化代码,所以你获得无意义的执行时间。换句话说,由于没有任何输出调用例如printf或cout<lt;对于变量a、b、c,因此优化后的代码对"for循环"就是为什么我的程序执行时间非常短,只有10ms。正确的为什么他们说时间结果对于"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("nnElapsed time = %u milliseconds %dn", milliSecondsElapsed,max);
    return 0;
}

运行时绝对是而不是没有意义。它证明了至少一个重要的观点:优化器比给定的信用更聪明,并且它能够推断出循环没有副作用,所以它将其删除。

因此,即使概要文件的结果只证明了这一点,它也有意义。

要解决您想要的问题:

我试图通过2e8迭代来找出"for循环"的确切执行时间。

如果没有可观察到的影响,则具有2e8for循环的执行时间可以是0。或者非常大(如果有的话)。这就是为什么您通常使用专用工具来评测实际的代码。

编译器可以以任何不改变任何可观察到的东西的方式更改程序,即所有输出等必须与未优化代码的输出完全相同。在您的示例中,编译器可能会注意到,循环后的abc的值从未使用过,并且该循环不做任何其他事情,因此它可能会从程序中删除该循环。

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

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

编辑:

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