我需要以最快的可能方式加入/减少指针。
我注意到以下两个函数将指针增加相同的值,但最终结果相同,但第二个函数比第一个快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中增量和减少指针的最佳和最快的方法是什么?
答案 0 :(得分:2)
我的测试(柏林,Win32,10 ^ 6重复,秒表)在这些程序之间的经过时间没有显示出显着差异。
但是调试和释放时间因子约为7 - 也许释放优化消除了未使用变量的增量,因此时间是空循环或空函数调用。将参数类型更改为var会减少这种差异。
调试模式下生成的asm代码对于两个函数(var-variant的add dword ptr [ebp-$04], $04
或add dword ptr [eax],$04
)完全相同。
//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;