Delphi程序参数:var比指针慢吗?

时间:2013-04-18 00:37:58

标签: performance delphi pointers parameters

我在Delphi 6中有一个“发送”例程,它接受一个可变大小的数据块(一个固定大小的头,后跟不同数量的数据),并且该例程最终在Winsock中调用sendto()。我用两种方式对它进行了编码,一次是传递的块是var(有点误导,但它有效),一次是传递块的指针。用于基准测试的简单版本类似于:

type 
  header = record destination, serialnumber: integer end;
  pheader = ^header;

var
  smallblock: record h: header; data: array[1..5] of integer end;
  bigblock: record h: header; data: array[1..100] of integer end;

procedure send1(var h: header; size: integer);
begin
h.destination := 1; // typical header adjustments before sendto()
h.serialnumber := 2;
sendto(sock, h, size, 0, client, sizeof(client))
end;

procedure send2(p: pheader; size: cardinal);
begin
p^.destination := 1;
p^.serialnumber := 2;
sendto(sock, p^, size, 0, client, sizeof(client))
end;

procedure doit1;
begin
send1(smallblock.h, sizeof(smallblock));
send1(bigblock.h, sizeof(bigblock));
end;

procedure doit2;
begin
send2(@smallblock, sizeof(smallblock));
send2(@bigblock, sizeof(bigblock));
end;

“send”例程将经常被调用,具有许多不同的块大小,并且应该尽可能快。在做了一些简单的基准测试(通过使用gettickcount进行定时调用)之后,指针技术(doit2)在我的机器上运行速度比var技术(doit1)快3%,尽管我没有看到任何真正的区别在目标代码中的两种技术之间(不是我是汇编程序大师)。

由于我粗略的基准测试,3%是幻觉,还是指针技术真的击败了var技术?

1 个答案:

答案 0 :(得分:7)

传递var参数与指针参数没有性能差异。它们执行完全相同的操作(传递内存地址),并编译为类似的(如果不是相同的)汇编代码。因此,任何基准测试差异都可能是由基准测试本身的问题引起的,而不是由基准测试的代码引起的。例如,GetTickCount()并不是最好的基准测试工具。为代码计时的最佳方法是使用外部分析器,如AQTime。

顺便说一句,你的doit2()测试应该是这样的:

procedure doit2;
begin
  send2(@(smallblock.h), sizeof(smallblock));
  send2(@(bigblock.h), sizeof(bigblock));
end;