【发布时间】:2013-04-18 00:37:57
【问题描述】:
我在 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;
“发送”例程将经常被调用,具有许多不同的块大小,并且应该尽可能快。在运行了一些简单的基准测试之后(通过使用 gettickcount 计时调用),指针技术(doit2)在我的机器上运行起来似乎比 var 技术(doit1)快了大约 3%,尽管我没有看到任何真正的区别在目标代码中的两种技术之间(不是说我是汇编大师)。
3% 是我粗略的基准造成的错觉,还是指针技术真的击败了 var 技术?
【问题讨论】:
-
@mikey:不,没有。 :-) 在 Remy 的回答中查看我对您的回复。
-
3% 是一个巨大的差异。检查你的基准。
标签: performance delphi pointers parameters