Delphi2010内联没用?

Delphi2010内联没用?,delphi,delphi-2010,inline,inlining,Delphi,Delphi 2010,Inline,Inlining,Delphi中的内联函数或过程(特别是这里的v2010,但我在TurboDelphi中也遇到了同样的问题)是什么 关于它的帮助中有一些discalimer可能并不总是内联函数,因为“某些条件”意味着什么 但我发现,通常内联函数(即使是非常简单的具有3或4行代码的函数)会减慢代码的速度,而不是加快代码的速度 一个好主意是使用编译器选项“内联所有内容”。我不在乎我的exe是否增长了50%左右以使它工作得更快 有没有一种方法可以强制Delphi真正内联代码,即使编译器没有决定将其内联?那真的很有帮助。

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

关于它的帮助中有一些discalimer可能并不总是内联函数,因为“某些条件”意味着什么

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

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

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


这里有什么提示吗?

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

另外,您说过,只要程序变快,您不介意将其变大,但内联通常会使其变慢。你应该意识到这可能是相关的。编译的代码越大,指令缓存丢失的次数就越多,这会降低执行速度


如果你真的想加速你的程序,通过一个分析器运行它。我建议,它是免费的,可以使用Delphi代码(包括2010),并且不会降低执行速度。它将向您显示一个详细的报告,说明您实际花费最多时间执行的代码。一旦你发现了瓶颈,你可以专注于瓶颈并尝试优化它们。

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

如果函数不是内联的,那么它将拥有(几乎)所有可用的CPU寄存器


我发现,内联包含循环的函数通常不是一个好主意。它们将使用一些可能最终进入内存的变量,从而降低内联代码的速度。

如果要强制内联,请使用include file。您需要确保声明了正确的变量,然后使用{$I filename.inc}。这将始终将特定代码注入到您想要的地方,并在需要更改时使其更易于维护


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

如果我正确理解FPC编译器的一个版本(有相同的问题),内联只能在要内联的例程已编译时发生

如果您将具有内联函数的单元设置为“叶”单元,并将其作为项目(.dpr)的uses子句中的第一个,那么应该可以。注意,对于“叶”单元,我指的是不依赖于项目中其他单元的单元,只依赖于已经编译的单元

我不会感到惊讶,在Delphi中也是如此,因为它共享一个基于相同原则的单元系统


在不违反单独编译原则的情况下,它也是非常不可编译的。

代码内联控件设置为auto没有帮助。采样分析器很棒。非常有助于显示瓶颈在真实统计数据中的位置。即使它真的向我展示了我已经拥有的新东西。它肯定会在未来派上用场。谢谢。增加运行特定算法所需的字节数,也会占用更多的CPU缓存。在极少数情况下,这也可能有影响。拉尔斯+1-除了它不是那么罕见。