现代优化编译器如何确定何时进行优化?

7
现代优化编译器如何确定何时应用某些优化,例如循环展开和代码内联?
由于两者都会影响缓存,因此简单的启发式算法,如内联少于X行的函数,可能会生成性能更差的代码。那么,现代编译器如何处理这个问题?
我很难找到相关信息(特别是易于理解的信息...),最好能找到的是wikipedia article。非常感谢提供任何细节、书籍/文章/论文链接!
编辑:由于答案主要涉及我提到的两种优化(内联和循环展开),我想澄清一下,我对所有编译器优化都感兴趣,不仅限于这两个。我更关心在静态编译期间可以执行的优化,尽管JIT优化也有一定的兴趣(但略微较少)。
谢谢!
4个回答

4

JIT并不总是有时间进行一些大规模的优化,而且代码路径有时会因数据而大幅变化,因此基于性能分析的优化甚至并不总是正确的选择。 - Sebastian Mach

0

你可以查看Spiral项目。

此外,一般情况下优化是一件棘手的事情。这也是为什么gcc编译器有那么多选项的原因之一。如果你了解缓存和页面等知识,你可以手动进行一些操作,并请求其他操作通过编译器完成,但是没有两台机器是相同的,因此方法必须是临时的。


0

好的链接,但这只讨论了微小的优化。 - dmckee --- ex-moderator kitten

0

好问题。你在问所谓的推测优化。

动态编译器使用静态启发式和配置文件信息。静态编译器采用启发式和(离线)配置文件信息。后者通常被称为 PGO(Profile Guided Optimizations)。

有很多关于内联策略的文章。最全面的是

An Empirical Study of Method Inlining for a Java Just-In-Time Compiler

它还包含了相关工作的参考文献以及对一些考虑过的文章的尖锐批评(合理的)。

总的来说,现代编译器试图使用影响分析来估计推测优化的潜在影响,然后再应用它们。

P.S. 循环展开是老古董,只有在执行仅涉及数字运算操作(没有调用等)的紧密循环时才有帮助。方法内联是现代编译器中更重要的优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接