1

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

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

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

4

2 回答 2

3

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

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

因为 for 循环什么都不做,只是修改了一个局部变量,其作用域只位于 for 循环中。

至于上述声明使整个程序更快......我认为它不能......

于 2013-08-16T19:39:28.277 回答
0

假设这样一个无用的循环对编译后的代码有任何影响,性能差异的一个来源可能是分支指令落在不同的桶中,从而使 CPU 中的分支预测更加准确(请参阅为什么引入无用的 MOV 指令会加速 x86_64 中的紧密循环组装?)。但是,您必须在受控环境中运行程序才能进行适当的测试;我不相信在线法官所做的测量。

于 2013-08-17T07:20:58.207 回答