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