【发布时间】:2013-08-16 19:35:03
【问题描述】:
我在一些竞争性的编程网站上练习,比如UVa 或LOj,并注意到有好几次(10 次或更多!)在我的程序中放置了一个不必要的循环,例如,将它放在开头程序-
for (int _delay = 0; _delay < 500000000; _delay++ );
让它比平常跑得更快(!),并给我更好的排名。我一遍又一遍地重新提交,但这种情况一直在发生。 我的问题是这怎么可能?只是巧合(发生了很多次)还是编译后的程序由于某种原因得到了优化?
【问题讨论】:
-
如果您想知道,我曾经写过一个延迟函数,但在第一次发生这种情况时,我在程序开始时错误地调用了它。
-
您可以通过比较带有和不带有该循环的机器代码来解决大多数优化问题。
-
好吧,这有点奇怪,但我可以看到改变一些启发式的值,最终可能会使编译器以不同的方式编译它。看看汇编代码就知道了。
-
顺便说一句,如果你第一次和第二次提交给 UVa 的时间间隔很长(例如,超过一年),请记住 UVa 会不断升级他们的系统,所以你的第二次尝试肯定会运行即使代码相同,也比第一次尝试更快。
-
@keelar 我已经在几分钟内重新提交了那些带有和不带有 for 循环的代码。
标签: c++ visual-c++ compiler-optimization