2013-02-12 11 views
9

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; 
+1

@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

+1

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. –

+0

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. –

Antwort

6

Keine Performance-Engpass

Delphi Generika sind zusammengestellt. Der Compiler kennt die konkreten Typen unter kompilieren Zeit und es ist am besten, Ihnen den besten Code zu liefern, den es kann. Es sollte keine Unterschiede zwischen generischem und nicht-generischem Code geben, wenn der generierte Code zur Laufzeit überprüft wird.

Es gibt eine gute Chance, besseren Code mit Generika zu erhalten, da Sie eher vorgefertigte, effiziente, typsichere Datenstrukturen verwenden. Wenn Sie Ihre eigenen rollen, werden Sie wahrscheinlich Ecken und Kanten schneiden, weil wir ehrlich sein können, schreiben Sortieralgorithmen, effiziente Zuweisung usw. hart.

+0

@DavidHeffernan, lesen Sie Barrys Blog den ganzen Weg zurück bis 2007. Keine Erwähnung, wie die zweistufige Compilation funktioniert. Es macht einen gewissen Sinn, da die Einheiten, die generische Typen deklarieren, zu "DCU" kompiliert werden müssen und das kann unmöglich endgültigen Code enthalten, aber ich habe nichts gefunden. Wenn Sie einen Link haben, teilen Sie ihn bitte. –

+1

Ich fand diesen Artikel, der das Thema berührt: http://blogs.teamb.com/craigstuntz/2009/10/01/38465/ Wenn Sie darüber nachdenken, muss es ein zweistufiger Prozess sein. Wenn Sie zum Beispiel gegen die DCU-Datei kompilieren, die 'TList ' enthält, hat dieser nicht mehr den Quellcode für 'TList '. –

+0

@DavidHeffernan, danke für den Link. "Touches" in der Tat - ich wünschte, ich hätte mehr Informationen. –