妖哥 2008-4-8 20:57
初学 Delphi 嵌入汇编[28] - 把 EAX 的值置为 0 的三种方法与效率
[color=#008000]//以下三个函数功能一样, 但效率不同
[/color]
[color=#008000]{Fun1 需要读取常数 0, 最慢}[/color]
[b][color=#000080]function[/color][/b] Fun1: Integer;
[b][color=#000080]asm[/color][/b]
mov eax, [color=#0000ff]0[/color]
[b][color=#000080]end[/color][/b];
[color=#008000]{Fun2 与 Fun3 只是操作 CPU 的寄存器, 比 Fun1 快}[/color]
[b][color=#000080]function[/color][/b] Fun2: Integer;
[b][color=#000080]asm[/color][/b]
sub eax, eax
[b][color=#000080]end[/color][/b];
[color=#008000]{Fun3 最快}[/color]
[b][color=#000080]function[/color][/b] Fun3: Integer;
[b][color=#000080]asm[/color][/b]
[b][color=#000080]xor[/color][/b] eax, eax
[b][color=#000080]end[/color][/b];
[color=#008000]//速度测试
[/color][b][color=#000080]procedure[/color][/b] TForm1[color=#0000ff].[/color]Button1Click(Sender: TObject);
[b][color=#000080]var[/color][/b]
t: Cardinal;
i: Integer;
[b][color=#000080]begin[/color][/b]
t := GetTickCount;
[b][color=#000080]for[/color][/b] i := [color=#0000ff]0[/color] [b][color=#000080]to[/color][/b] [color=#0000ff]100000000[/color] [b][color=#000080]do[/color][/b] Fun1;
t := GetTickCount - t;
ShowMessage(IntToStr(t)); [color=#008000]{均: 600 多}[/color]
t := GetTickCount;
[b][color=#000080]for[/color][/b] i := [color=#0000ff]0[/color] [b][color=#000080]to[/color][/b] [color=#0000ff]100000000[/color] [b][color=#000080]do[/color][/b] Fun2;
t := GetTickCount - t;
ShowMessage(IntToStr(t)); [color=#008000]{均: 500 多}[/color]
t := GetTickCount;
[b][color=#000080]for[/color][/b] i := [color=#0000ff]0[/color] [b][color=#000080]to[/color][/b] [color=#0000ff]100000000[/color] [b][color=#000080]do[/color][/b] Fun3;
t := GetTickCount - t;
ShowMessage(IntToStr(t)); [color=#008000]{均: 400 多}[/color]
[b][color=#000080]end[/color][/b];