【发布时间】: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