【问题标题】:Do generics in Delphi cause performance bottlenecks?Delphi 中的泛型会导致性能瓶颈吗?
【发布时间】:2013-02-12 07:24:42
【问题描述】:

最近我一直在开发一个应用程序,并希望拥有几种类型的集合。我不想为它的类型声明和实现一个新的集合类。所以,我想使用泛型,但不确定泛型与普通类型实例相比的性能。性能是我关注的主要问题。我的应用程序对时间要求很高,甚至浪费 100 毫秒也是不可取的。

我正在使用 Delphi XE3

例如:

ICollectionItem = interface
  function GetID : string;
  property ID : string read GetId;
end;

TGenericCollection<T: ICollectionItem> = class
  function Add(T) : Integer;
end;

相比

TSomeClass = class(TInterfacedObject, ICollectionItem)
  function GetId : string;
end;

TSomeClassList = class
  function Add(item : TSomeClass) : Integer;
end;

【问题讨论】:

  • @LievenKeersmaekers 我也没有 XE3,所以我没有回答,但在早期版本中,泛型根本没有得到很好的优化。它们似乎被编译成某种伪程序集,当泛型被实例化时会被修补,因此,原本可以使用的优化(甚至像在编译时评估 SizeOf(T) + 1 一样简单)不是。
  • "Using Generic containers in Delphi XE - always?"。更好的性能,因为优化可以做得更好。另见"Overview of Generics"。在实例化时可能会有性能损失。
  • 您是否确认您的收藏代码是您应用程序的瓶颈?另外,Q中的TSomeClassList.Add是错误的。参数需要是ICollectionItem。这只是一个错字吗?如果你想比较性能,是什么阻止了你。试图预先判断它只会让你到目前为止。编写两个版本的代码并对它们进行计时。
  • 我不认为速度上有任何明显的差异,但大小是有的。目前编译器为每个具体类型生成代码,即使某些类型可以共享实现。
  • 同意hvd。理论上泛型应该相同或更好——实际上编译器不够好+在使用泛型时通常会产生更慢的代码。例如。它不会内联使用泛型的函数(无论如何在 XE2 中)。

标签: delphi generics delphi-xe3


【解决方案1】:

没有性能瓶颈

Delphi 泛型已编译。编译器在 compile 时知道具体的类型,它会尽力为您提供最好的代码。在运行时检查生成的代码时,通用代码和非通用代码之间应该没有区别。

很有可能使用泛型获得更好的代码,因为您更有可能使用现成的、高效的、类型安全的数据结构。当你自己滚动时,你可能会偷工减料,因为老实说,编写排序算法、高效分配等是困难

【讨论】:

  • @DavidHeffernan,一直读到 2007 年的 Barry 博客。没有提及两阶段编译的工作原理。这是有道理的,因为声明泛型类型的单元需要编译为 DCU 并且不可能包含最终代码,但我什么也没找到。如果你有链接,请分享。
  • 我发现这篇文章涉及到这个主题:blogs.teamb.com/craigstuntz/2009/10/01/38465 如果你仔细想想,它必须是一个两阶段的过程。例如,当您针对包含 TList&lt;T&gt; 的 DCU 文件进行编译时,该文件不再具有 TList&lt;T&gt; 的源代码。
  • @DavidHeffernan,感谢您的链接。确实“触动”了——我希望我有更多的信息。
  • @DavidHeffernan 感谢您提供的信息链接..我将使用泛型和类型列表测试性能..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 2020-09-10
  • 2010-11-22
  • 2018-07-20
相关资源
最近更新 更多