【问题标题】:Delphi 2010 inlining useless?Delphi 2010 内联没用?
【发布时间】:2010-12-21 03:57:23
【问题描述】:

Delphi 中的内联函数或过程有什么用?

由于“某些标准”,无论这意味着什么,帮助中可能并不总是内联函数。

但我发现通常内联函数(即使是具有 3 或 4 行代码的非常简单的函数)会减慢代码而不是加快代码速度。

一个好主意是“内联所有内容”的编译器选项。我不在乎我的 exe 是否会增长 50% 左右以使其运行得更快。

有没有一种方法可以强制 Delphi 真正内联代码,即使编译器没有决定内联代码?那真的很有帮助。否则,您需要在代码的多个区域中复制过程代码的“手动内联”,并带有“//inlining failed here 之类的注释,因此如果您更改接下来的 5 行,请在其他 8 个重复点中更改它们,此代码存在"

这里有什么提示吗?

【问题讨论】:

    标签: delphi delphi-2010 inline inlining


    【解决方案1】:

    有一个用于自动内联短例程的编译器选项。在项目选项中,在 Delphi 编译器 -> 编译 -> 代码生成下,将“代码内联控制”设置为自动。但是请注意,这应该只在发布版本上,因为内联代码很难调试。

    另外,你说你不介意让你的程序变大,只要它变得更快,但是通常内联会让它变慢。您应该知道这可能是相关的。编译的代码越大,指令缓存未命中的次数就越多,这会减慢执行速度。

    如果您真的想加快程序速度,请通过分析器运行它。我推荐Sampling Profiler,它是免费的,可以使用Delphi 代码(包括2010)并且不会减慢您的执行速度。它将向您显示您实际花费最多时间执行的代码的详细报告。发现这一点后,您可以专注于瓶颈并尝试对其进行优化。

    【讨论】:

    • 代码内联控件设置为自动没有帮助。采样探查器很棒。非常有助于显示实际统计数据中的瓶颈所在。即使它真的向我展示了我已经新的东西。它肯定会在未来派上用场。谢谢。
    【解决方案2】:

    如果我正确理解了其中一个 FPC 编译器开发(具有相同问题),则内联只能在要内联的例程已经编译时发生。

    IOW 如果您将具有 inlined-to-be 功能的单元设为“叶”单元,并将其放在项目 (.dpr) 的 uses 子句中的第一个位置,则应该没问题。请注意,“叶”单元是指不依赖于项目中其他单元的单元,仅依赖于已编译的单元。

    我不会对 Delphi 中的相同之处感到惊讶,因为它共享基于相同原理的单位系统。

    如果不违反单独的编译原则,它也是相当不可修复的。

    【讨论】:

      【解决方案3】:

      如果您想强制内联,请使用包含文件。您需要确保声明正确的变量,然后使用 {$I filename.inc}。这将始终将特定代码注入您想要的位置,并在您需要更改时更容易维护。

      请记住,编译器是由比大多数普通人(包括我自己)更聪明的人编写的,并且在决定是否内联时可以访问更多信息,因此当它不内联时可能有充分的理由。

      【讨论】:

        【解决方案4】:

        在某些情况下,内联会使事情变慢。内联函数可能会增加局部变量所需的 CPU 寄存器数量。如果没有足够的寄存器,可用变量将被定位在内存中,这会使其变慢。

        如果函数没有被内联,它将拥有(几乎)所有可用的 CPU 寄存器。

        我发现内联包含循环的函数通常不是一个好主意。他们将使用一些可能最终在内存中的变量,从而使内联代码变慢。

        【讨论】:

        • 增加运行某种算法所需的字节数,也会消耗更多的 CPU 缓存。在极少数情况下,这也会产生影响。
        • Lars +1 - 但它并不罕见。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-10
        • 2011-11-10
        相关资源
        最近更新 更多