我有两个几乎相同的循环,但性能上有显着差异,两者都在MSVC2010上进行测试,在系统~2.4 GHZ和8GB内存
低于循环需要大约2500毫秒才能执行
for (double count = 0; count < ((2.9*4/555+3/9)*109070123123.8); count++)
;
此循环执行时间不到1毫秒
for (double count = ((2.9*4/555+3/9)*109070123123.8); count >0; --count)
;
这里有什么巨大的差异?一个得到后增量和其他使用预增量可以导致如此巨大的差异?
答案 0 :(得分:5)
你在没有优化的情况下进行编译,因此比较是徒劳的。 (如果你确实进行了优化,那么代码就会完全被删除。)
如果没有优化,计算很可能在第一个循环的每次迭代中执行,而第二个循环只在第一次初始化count
时进行一次计算。
尝试将第一个循环更改为
auto max = ((2.9*4/555+3/9)*109070123123.8);
for (double count = 0; count < max; count++)
;
然后停止分析调试版本。
答案 1 :(得分:2)
在第一个循环中,每次循环计算count < ((2.9*4/555+3/9)*109070123123.8)
,其中第二个count = ((2.9*4/555+3/9)*109070123123.8)
计算一次,每次循环递减。