【问题标题】:Delphi procedure parameter: var is slower than pointer?Delphi过程参数:var比指针慢?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • @mikey:它没有发送smallblock.h。它正在发送一条smallblock 记录,从smallblock.h 的地址开始。 IOW,它正在发送从smallblock.h 地址开始的sizeof(smallblock.h) + sizeof(smallblock.data) 字节。
  • 好吧,它是缓冲区 [0] - 谢谢 - 我会删除 - 我没有在我的脑海中刻上 sendto。 :-) 这就是雷米的意思。这就是我再次开始在这个网站上闲逛的原因。一直在为 2.5 工作,我不做任何此类工作。 '使用它或失去它'。这个网站帮助我保持敏锐。但是,如果他无论如何都在使用 var ,那么它的写法可能很好。如果参数声明为 var,@ 是否必要?无论如何,它是一个指针。
  • 另外,我发现它在 1.repeating 基准测试和 2.reversing 测试顺序时存在细微差别。 3% 在此容差范围内。我还看到了在真正的测试开始让现代 CPU 处理工作负载之前 进行 CPU 密集型计算的基准测试。我不知道这是否是宗教,但从解释来看,我倾向于遵循这种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2016-12-02
  • 1970-01-01
  • 2020-04-19
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多