Delphi 中的内联函数或过程是什么(特别是 v2010,但我在 Turbo Delphi 中也遇到了同样的问题)?

帮助中有一些关于它可能并不总是内联函数的警告,因为“某些标准”无论这意味着什么。

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

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

有没有一种方法可以强制 Delphi 真正内联代码,即使编译器没有决定内联代码?这确实有帮助。否则,您需要进行“手动内联”,在代码的多个区域中复制过程代码,并添加诸如“//内联在此失败,因此如果您更改接下来的 5 行,请在该代码存在的其他 8 个重复点中更改它们” ”

这里有什么建议吗?

有帮助吗?

解决方案

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

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

如果您确实想加快程序速度,请通过分析器运行它。我建议 采样分析器, 是免费的,可与 Delphi 代码(包括 2010)一起使用,并且不会减慢您的执行速度。它将向您显示一份详细报告,说明您实际上花费最多时间执行的代码。一旦发现这一点,您就可以专注于瓶颈并尝试优化它们。

其他提示

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

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

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

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

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

如果我正确地理解了 FPC 编译器开发之一(具有相同的问题),则只有当要内联的例程已经编译时才会发生内联。

IOW,如果您将具有内联函数的单元设置为“叶子”单元,并将其作为项目(.dpr)的使用子句中的第一个,那么应该没问题。请注意,对于“叶”单元,我的意思是不依赖于项目中其他单元的单元,仅依赖于已编译的单元。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top