我正在尝试优化一段代码,其中有这样的结构:
while (i > 0) do begin
Dec(i);
这看起来很低效,所以我尝试了这个方法:
while (Dec(i) >= 0) do begin
那样做不起作用,因为Dec是一个过程而不是函数。
所以我重写成:
procedure Withloop;
var
....
function Decr(var a: integer): integer; inline;
begin
Dec(a);
Result:= a;
end;
...
while (Decr(i) >= 0) do begin
但是这将被编译为:
SDIMAIN.pas.448: while (Decr(i) >= 0) do begin
00468EE5 8BC4 mov eax,esp
00468EE7 E8D0FEFFFF call Decr <<--- A call??
00468EEC 85C0 test eax,eax
00468EEE 0F8D12FFFFFF jnl $00468e06
00468EF4 EB01 jmp $00468ef7
然而,在程序的另一部分,它可以很好地内联一个函数。
有什么经验法则(或硬性规定)可以让我知道Delphi会遵守inline
指令吗?
hot
,否则我也不会费这个劲儿。测试做了更多的事情,但我将其简化到了本质。此外,我知道你不能内联asm函数,因此逻辑选择:function Decr(var a: integer): integer; inline; begin asm DEC EAX end; end;
已经被排除了。 - Johan