Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;不同循环的运行时_C++_C++11 - Fatal编程技术网

C++ C++;不同循环的运行时

C++ C++;不同循环的运行时,c++,c++11,C++,C++11,为什么这两个循环都需要相同的时间,if语句不应该使第一个循环慢很多吗 // Example program #include <iostream> #include <string> #include <vector> using namespace std; int main() { i

为什么这两个循环都需要相同的时间,if语句不应该使第一个循环慢很多吗

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

如果实际使用
计数器
(如输出),您将获得更精确的基准测试。否则,gcc会发现,
计数器的计算是不必要的,因此不会浪费时间。

如果实际使用
计数器(如输出),您将获得更准确的基准。否则,gcc会发现,
计数器的计算是不必要的,因此它不会费心浪费时间。

整个循环几乎不会削弱现代的数千兆赫CPU、巨大的1级和2级CPU缓存以及极快的内存

在您看到任何差异之前,您必须想出两种不同的执行路径,它们有着不同的方式,方式,比一个简单的if()语句更有实质性的区别


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

整个循环几乎不会削弱现代的数千兆赫CPU、巨大的1级和2级CPU缓存以及极快的内存

在您看到任何差异之前,您必须想出两种不同的执行路径,它们有着不同的方式,方式,比一个简单的if()语句更有实质性的区别


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

我认为,您没有使用变量
计数器这一事实正在促使编译器对其进行优化。试着放一个
cout我认为你没有使用变量
计数器
这一事实让编译器对它进行了优化。尝试放置
cout如果您添加
-S
开关以生成程序集,您将看到两个程序都生成相同的代码(实际字符串除外)。我怀疑整个循环已经被优化了,因为它在编译时是完全确定的?代码是否确实包含任何循环,编译器是否注意到未定义的行为并简单地消除了所有内容?因此,如果我为循环设置退出条件,如果您添加
-S
开关以生成程序集,您将看到两个程序都生成相同的代码(实际字符串除外)。我怀疑整个循环已经被优化了,因为它在编译时是完全确定的?代码是否真的包含任何循环,编译器是否注意到未定义的行为并简单地消除了所有内容?因此,如果我将循环的退出条件设为iyeah,我也在考虑管道化,但只是不确定。非常感谢。这听起来不错,但并不完全正确。在我使用gcc-5.3的笔记本电脑(当然不是超级计算机,但仍然是i5)上,第一台大约需要5毫秒,而第二台大约需要2.5毫秒,平均每台需要10次试验。所以时间是可以测量的。然而,为了得到结果,我必须说服gcc实际编译循环;看看我的答案。(在这种情况下,叮当做了更好的优化。)是的,我也在考虑管道,但只是不确定。非常感谢。这听起来不错,但并不完全正确。在我使用gcc-5.3的笔记本电脑(当然不是超级计算机,但仍然是i5)上,第一台大约需要5毫秒,而第二台大约需要2.5毫秒,平均每台需要10次试验。所以时间是可以测量的。然而,为了得到结果,我必须说服gcc实际编译循环;看看我的答案。(在本例中,clang的优化效果更好。)
g++ -std=c++11 -O3 test.cpp -Dsingle -o test