我正在一些有竞争力的编程网站上练习,比如UVa或LOj并注意了几次(10次或更多次!),在我的程序中放置了一个不必要的循环,例如,该计划的开始 -
for (int _delay = 0; _delay < 500000000; _delay++ );
让它跑得更快(!)通常并给我更好的排名。我一遍又一遍地重新提交,但这种情况一直在发生。 我的问题是这怎么可能?只是巧合(发生了很多次)或者编译程序是否因某种原因而得到优化?
答案 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?)。您必须在受控环境中运行该程序才能进行正确的测试;我不相信在线法官所做的测量。