C++具有不同循环的运行时
C++ run time with different loops
为什么这两个循环花费的时间相同,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;
。
相关文章:
- 我可以根据用户输入在运行时生成"循环"吗?
- 类方法 - 数据结构中 For 循环的运行时错误
- 为什么程序运行时我的第二个循环不执行?
- 为什么我的代码在运行时保持循环
- 骰子滚轮随机循环每次运行时都保持相同的值
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 查找涉及 while 循环的运行时函数
- OpenCL仅在循环呼叫时停止运行
- 默认情况下,C++ 开关运行时循环
- Bash 代码,仅在当前可执行文件完成运行时在循环中运行可执行文件
- OPENCV C .在for循环中在不同的图像像素上绘制一个圆圈(应在每个循环运行时将图像打开)
- 是否有一种方法可以在运行时停止循环重复一次不止一次
- 在循环中使用lower_bound函数会给出运行时错误
- 如何在每次运行时将数字从循环中提取出来
- Windows 生物识别服务在调用 WinBioCaptureSample 时循环运行 SensorAdapterSta
- 每当我的程序运行时,使用SRAND(TIME(NULL))都会给出相同的输出(不在循环中,播种有足够大的值)
- 为什么当循环再次运行时,此输出"请重试"?
- 循环运行时错误
- 循环和运行时错误中的C 变量声明
- 尝试拆分循环链表.显示输出但崩溃.在 IDEone 中显示运行时错误