Delphi 中的快速指针 Increment/Decrement
Fast Pointer Increment/Decrement in Delphi
我需要以最快的方式inc/dec指点。
我注意到以下两个函数将指针增加相同的值,最终结果相同,但第二个比第一个快 4 倍。
procedure First(P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PByte(P), 4);
end;
procedure Second(P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PCardinal(P), 1); //Increments by 4, actually, because Cardinal is 4 bytes.
end;
在 Delphi 中递增和递减指针的最佳和最快方法是什么?
我的测试(Berlin、Win32、10^6 次重复、秒表)未显示这些程序之间的运行时间有显着差异。
但调试和发布时间相差约 7 倍 - 也许发布优化消除了未使用变量的增量,因此时间用于空循环或调用空函数。将参数类型更改为 var 会减小这种差异。
两个函数在调试模式下生成的 asm 代码完全相同(add dword ptr [ebp-],
或 add dword ptr [eax],
对应 var-variant)。
//parameter by value
Debug 2043 2013
Release 312 297
//var-parameter
Debug 1872 1888
Release 1732 1685
不管怎样,速度大约是每秒百万增量,所以我不认为增量是真正的瓶颈
procedure First(var P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PByte(P), 4);
end;
procedure Second(var P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PCardinal(P), 1); //Increments by 4, actually, because Cardinal is 4 bytes.
end;
var
Sw: TStopWatch;
k: Integer;
t, t2: int64;
p: Pointer;
begin
sw.Start;
t := sw.ElapsedMilliseconds;
for k := 1 to 1000000 do begin
p := nil;
First(p);
end;
t2 := sw.ElapsedMilliseconds;
Memo1.Lines.Add (IntToStr(t2 - t));
t := sw.ElapsedMilliseconds;
for k := 1 to 1000000 do begin
p := nil;
Second(p);
end;
t2 := sw.ElapsedMilliseconds;
Memo1.Lines.Add (IntToStr(t2 - t));
sw.Stop;
我需要以最快的方式inc/dec指点。
我注意到以下两个函数将指针增加相同的值,最终结果相同,但第二个比第一个快 4 倍。
procedure First(P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PByte(P), 4);
end;
procedure Second(P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PCardinal(P), 1); //Increments by 4, actually, because Cardinal is 4 bytes.
end;
在 Delphi 中递增和递减指针的最佳和最快方法是什么?
我的测试(Berlin、Win32、10^6 次重复、秒表)未显示这些程序之间的运行时间有显着差异。
但调试和发布时间相差约 7 倍 - 也许发布优化消除了未使用变量的增量,因此时间用于空循环或调用空函数。将参数类型更改为 var 会减小这种差异。
两个函数在调试模式下生成的 asm 代码完全相同(add dword ptr [ebp-],
或 add dword ptr [eax],
对应 var-variant)。
//parameter by value
Debug 2043 2013
Release 312 297
//var-parameter
Debug 1872 1888
Release 1732 1685
不管怎样,速度大约是每秒百万增量,所以我不认为增量是真正的瓶颈
procedure First(var P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PByte(P), 4);
end;
procedure Second(var P: Pointer);
var
i: Integer;
begin
for i := 1 to 1024 do
Inc(PCardinal(P), 1); //Increments by 4, actually, because Cardinal is 4 bytes.
end;
var
Sw: TStopWatch;
k: Integer;
t, t2: int64;
p: Pointer;
begin
sw.Start;
t := sw.ElapsedMilliseconds;
for k := 1 to 1000000 do begin
p := nil;
First(p);
end;
t2 := sw.ElapsedMilliseconds;
Memo1.Lines.Add (IntToStr(t2 - t));
t := sw.ElapsedMilliseconds;
for k := 1 to 1000000 do begin
p := nil;
Second(p);
end;
t2 := sw.ElapsedMilliseconds;
Memo1.Lines.Add (IntToStr(t2 - t));
sw.Stop;