C++具有不同循环的运行时

C++ run time with different loops

本文关键字:循环 运行时 C++      更新时间:2023-10-16

为什么这两个循环花费的时间相同,if 语句不应该使第一个循环慢得多吗?

// Example program                                                                                     
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
  int counter = 0;
  #ifdef single
  cout << "one for loopn";
  for(int i =0;i<10000000;i++)
    {
      if(i != 50000) counter+=i;
    }
#else
  cout << "two loopsn";
  for(int i = 0;i<50000;i++)
    {
      counter+=i;
    }
  for(int i = 50001;i<10000000;i++)
    {
      counter+=i;
    }
#endif
  return 0;
}

随着时间的推移,我得到以下结果:时间 ./测试一个为循环

实际 0m0.004s用户 0M0.001s系统 0m0.002s

两个循环

实际 0m0.004s用户 0M0.001s系统 0m0.002s

我做了一些研究,它说这是分支的原因,但我不确定这是否是唯一的原因,它被编译为

g++ -std=c++11 -O3 test.cpp -Dsingle -o test

整个循环几乎没有影响,现代,数千兆赫的CPU,巨大的1级和2级CPU缓存以及极快的内存。

在你看到任何差异之前,你将不得不提出两个替代的执行路径,它们有方式,方式,更实质性的差异,而不是像这样的单个微不足道的if()语句。

可以这样想:现代CPU有各种疯狂的流水线,这使得CPU不仅可以执行当前指令,还可以执行之后的几条指令。同时进行。当当前指令是循环增量时,CPU 可能已经弄清楚下一个 if() 的计算结果,以及之后该怎么做。所有这些都在同一组时钟周期内。

如果你真的对counter做一些事情(比如输出它),你会得到一个更准确的基准。否则,gcc 会发现counter的计算是不必要的,因此它不会浪费时间去做。

我认为您没有使用变量counter这一事实正在使编译器对其进行优化。尝试在return 0;之前放一个cout << counter << endl;