为什么C ++不必要的循环制作程序更快?

时间:2013-08-16 19:35:03

标签: c++ visual-c++ compiler-optimization

我正在一些有竞争力的编程网站上练习,比如UVaLOj并注意了几次(10次或更多次!),在我的程序中放置了一个不必要的循环,例如,该计划的开始 -

for (int _delay = 0; _delay < 500000000; _delay++ );

让它跑得更快(!)通常并给我更好的排名。我一遍又一遍地重新提交,但这种情况一直在发生。 我的问题是这怎么可能?只是巧合(发生了很多次)或者编译程序是否因某种原因而得到优化?

2 个答案:

答案 0 :(得分:3)

我认为大多数编译器都会忽略您提到的以下声明:

for (int _delay = 0; _delay < 500000000; _delay++ );

因为for循环不做任何事情,只是修改一个局部变量,该变量只存在于for循环中。

至于上面的陈述使整个程序更快......我认为不可能......

答案 1 :(得分:0)

假设这样一个无用的循环对编译代码有任何影响,性能差异的一个来源可能是落在不同桶中的分支指令,使得CPU中的分支预测更准确(参见Why would introducing useless MOV instructions speed up a tight loop in x86_64 assembly?)。您必须在受控环境中运行该程序才能进行正确的测试;我不相信在线法官所做的测量。