Kürzlich habe ich eine Anwendung entwickelt und wollte eine Sammlung von verschiedenen Arten haben. Ich möchte keine neue Collection-Klasse für ihren Typ deklarieren und implementieren. Also, ich dachte an Generika, aber war mir nicht sicher über die Leistung von Generics im Vergleich zu normalen typisierten Instanzen. Leistung ist das Wichtigste, das ich betrachte. Meine Anwendung ist zeitkritisch und es ist auch nicht ratsam, einige 100 Millisekunden zu verlieren.Führen Generics in Delphi zu Leistungsengpässen?
Ich verwende Delphi XE3
Für zB:
ICollectionItem = interface
function GetID : string;
property ID : string read GetId;
end;
TGenericCollection<T: ICollectionItem> = class
function Add(T) : Integer;
end;
im Vergleich zu
TSomeClass = class(TInterfacedObject, ICollectionItem)
function GetId : string;
end;
TSomeClassList = class
function Add(item : TSomeClass) : Integer;
end;
@LievenKeersmaekers Ich habe auch XE3 nicht, also habe ich nicht geantwortet, aber in früheren Versionen sind Generika überhaupt nicht sehr gut optimiert. Sie scheinen in eine Art Pseudo-Assemblierung kompiliert zu werden, die bei der Instanziierung des Generic gepatcht wird, und als Ergebnis Optimierungen, die sonst verwendet werden könnten (sogar so einfach wie die Evaluierung von SizeOf (T) + 1 zur Kompilierungszeit)) sind nicht. – hvd
Siehe ['" Verwenden von generischen Containern in Delphi XE - immer? "'] (Http://stackoverflow.com/q/5313756/576719). Bessere Leistung seit Optimierung kann einen besseren Job machen. Siehe auch [''Überblick über Generics''] (http://docwiki.embarcadero.com/RADStudio/XE3/en/Overview_of_Generics). Bei der Instantiierung kann es zu einer Leistungseinbuße kommen. –
Haben Sie überprüft, dass Ihr Sammlungscode der Engpass Ihrer Anwendung ist? Außerdem ist TSomeClassList.Add im Q falsch. Parameter muss ICollectionItem sein. Ist das nur ein Tippfehler? Wenn Sie die Leistung vergleichen möchten, was hält Sie davon ab? Der Versuch, es vorher zu beurteilen, bringt dich nur soweit. Schreibe zwei Versionen des Codes und Zeit sie beide. –