【问题标题】:How do modern optimizing compilers determine when to optimize?现代优化编译器如何确定何时优化?
【发布时间】:2012-08-24 05:10:36
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: optimization gcc compiler-construction compiler-optimization


    【解决方案1】:

    通常还是那么天真,希望这是一种进步。

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

    参考资料:

    【讨论】:

    • JIT 并不总是有时间进行一些大规模的优化,而且代码路径有时会在数据上发生巨大变化,因此配置文件引导的优化甚至并不总是正确的路径。
    【解决方案2】:

    您可以查看Spiral 项目。

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

    【讨论】:

      【解决方案3】:

      简而言之:比我们强!

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

      迪迪尔

      【讨论】:

      • 不错的链接,但这仅讨论微优化。
      【解决方案4】:

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

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-02-14
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多