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;