6

Delphi 中的内联函数或过程有什么用(特别是这里的 v2010,但我对 Turbo Delphi 有同样的问题)?

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

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

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

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

这里有什么提示吗?

4

4 回答 4

12

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

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

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

于 2009-11-28T05:31:18.200 回答
4

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

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

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

于 2009-11-28T08:48:00.283 回答
2

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

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

于 2009-11-28T15:07:25.723 回答
0

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

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

我不会惊讶它在 Delphi 中是一样的,因为它共享一个基于相同原理的单位系统。

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

于 2009-11-28T20:51:54.827 回答