Delphi中的快速指针递增/递减

时间:2018-02-16 02:59:37

标签: delphi pointers pointer-arithmetic

我需要以最快的可能方式加入/减少指针。

我注意到以下两个函数将指针增加相同的值,但最终结果相同,但第二个函数比第一个快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中增量和减少指针的最佳和最快的方法是什么?

1 个答案:

答案 0 :(得分:2)

我的测试(柏林,Win32,10 ^ 6重复,秒表)在这些程序之间的经过时间没有显示出显着差异。

但是调试和释放时间因子约为7 - 也许释放优化消除了未使用变量的增量,因此时间是空循环或空函数调用。将参数类型更改为var会减少这种差异。

调试模式下生成的asm代码对于两个函数(var-variant的add dword ptr [ebp-$04], $04add 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;