7

现代优化编译器如何确定何时应用某些优化,例如循环展开和代码内联?

由于这两者都会影响缓存,因此使用少于 X 行的天真内联函数或任何其他简单的启发式方法可能会生成性能更差的代码。那么,现代编译器是如何处理这个问题的呢?

我很难找到这方面的信息(尤其是相当容易理解的信息..),我能找到的最好的是维基百科文章。非常感谢任何细节,书籍/文章/论文的链接!

编辑:由于答案主要是关于我提到的两个优化(内联和循环展开),我只是想澄清一下我对所有和任何编译器优化感兴趣,而不仅仅是这两个。我也对可以在提前编译期间执行的优化更感兴趣,尽管 JIT 优化也很有趣(尽管程度略低)。

谢谢!

4

4 回答 4

4

无论如何,通常都是那么天真,并希望这是一种进步。

这就是为什么即时编译是一种成功的策略。收集统计数据,然后针对常见情况进行优化。

参考:

于 2009-11-16T15:11:13.657 回答
0

您可以查看Spiral项目。

最重要的是,优化通常是一件很难的事情。这就是为什么 gcc 编译器有这么多选项的部分原因。如果您对缓存和页面有所了解,您可以手动完成一些事情并要求通过编译器完成其他事情,但没有两台机器是相同的,因此该方法必须是临时的。

于 2009-11-16T15:09:23.040 回答
0

简而言之:比我们好!

你可以看看这个:http ://www.linux-kongress.org/2009/slides/compiler_survey_felix_von_leitner.pdf

迪迪埃

于 2009-11-16T15:12:07.727 回答
0

好问题。您正在询问所谓的推测优化。

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

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

Java即时编译器方法内联的实证研究

它还包含对相关工作的引用和对一些考虑文章的尖锐批评(有道理)。

通常,最先进的编译器会尝试使用影响分析来估计推测优化的潜在影响,然后再应用它们。

PS Loop unrolling 是古老的经典东西,它仅有助于一些仅执行数字运算操作(无调用等)的紧凑循环。方法内联是现代编译器中更为重要的优化。

于 2009-11-16T15:28:55.823 回答