Generika vs. Array-Listen
System ich arbeite hier geschrieben wurde vor .net 2.0 und hat nicht den Vorteil von Generika. Es wurde schließlich auf 2.0 aktualisiert, aber keine der code wurde umgestaltet werden, aus Zeitgründen. Es gibt eine Reihe von Orten, wo der code verwendet ArraysLists etc. dass store Dinge als Objekte.
Aus performance-Sicht, wie wichtig ändern Sie den code, um die Verwendung von Generika? Ich weiß aus perfomance Sicht, boxing und unboxing etc., es ist ineffizient, aber wie viel von einem performance-Gewinn wird es wirklich aus sein, es zu ändern? Sind Generika so etwas auf einem go forward-basis, oder es gibt genug von einer Leistung, die einer gewissen Anstrengung sollte unternommen werden, um alten code?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Technisch die Leistung von Generika ist, wie du sagst, besser. Jedoch, es sei denn, die Leistung ist enorm wichtig UND Sie haben bereits optimiert, in anderen Bereichen sind Sie wahrscheinlich VIEL besser Verbesserungen, indem Sie verbringen Ihre Zeit an anderer Stelle.
Ich würde vorschlagen:
Natürlich gibt es auch andere Gründe, als die Leistung zu ändern, um Generika:
Hier die Ergebnisse habe ich aus einer einfachen Analyse der ein string aus einer 100KB Datei 100.000 mal. Die Generische List(Of char) nahm 612.293 Sekunden geht es 100.000 mal über die Datei.
Die ArrayList nahm 2,880.415 Sekunden geht es 100.000 mal über die Datei. Dies bedeutet, dass in diesem Szenario (wie Sie Ihre Laufleistung wird variieren) die Generische List(Of char) ist 4,7 mal schneller.
Hier ist der code, den ich lief über 100.000 mal:
Der einzige Weg, um sicher zu wissen ist es, das Profil der code mit einem tool wie dotTrace.
http://www.jetbrains.com/profiler/
Ist es möglich, dass das boxing/unboxing ist trivial in Ihrer speziellen Anwendung und wäre nicht Wert refactoring. Vorwärts gehen, sollten Sie noch prüfen, die Verwendung von Generika aufgrund der compile-Zeit-Typ Sicherheit.
Generika, ob Java-oder .NET, sollte verwendet werden, für design und geben Sicherheit, nicht für die Leistung. Autoboxing ist Verschieden von Generika (im wesentlichen das implizite Objekt primitive conversions), und wie Sie bereits erwähnt, sollten Sie NICHT verwenden, anstelle von einem primitiv, wenn es eine Menge von arithmetischen und anderen Operationen, die bewirkt, dass eine Leistung Treffer aus der wiederholt impliziten Objekterzeugung/- Zerstörung.
Insgesamt würde ich empfehlen, geht nach vorn, und nur die Aktualisierung der vorhandenen code, wenn es muss gereinigt werden, für die Typ-Sicherheit /design-Zwecke, nicht die Leistung.
Kommt es darauf an, die beste Antwort ist-Profil den code und sehen. Ich mag AQTime aber eine Reihe von Paketen existieren.
Im Allgemeinen, wenn eine ArrayList ist VIEL es Wert sein kann, wechseln Sie zu einer generischen version. Wirklich aber, es ist sehr wahrscheinlich, dass Sie würde nicht einmal in der Lage sein zu Messen, den Unterschied in der Leistung. Boxing und unboxing sind zusätzliche Schritte, aber moderne Rechner sind so schnell, dass es macht fast keinen Unterschied. Als eine ArrayList ist wirklich nur ein normales array mit einem schönen wrapper, würden Sie wahrscheinlich sehen, viel mehr performance gewonnen, besser Datenstruktur Auswahl (ArrayList.Entfernen ist O(n)!) als mit der Umstellung auf Generika.
Edit: Outlaw-Programmierer hat einen guten Punkt, Sie wird immer noch boxing und unboxing mit Generika, es passiert einfach implizit. Der gesamte code, um die Prüfung für die Ausnahmen und null-Werte aus Gießen und "ist" /"als" keywords würde ein wenig helfen, obwohl.
Die größten Gewinne, finden Sie in Wartung Phasen. Generika sind viel einfacher zu handhaben und zu aktualisieren, ohne sich mit conversion und casting-Probleme. Wenn dies ist der code, den Sie ständig besuchen, dann mit allen Mitteln nehmen die Mühe. Wenn dies ist der code, der noch nicht berührt worden in den Jahren, ich würde mich nicht wirklich stören.
Was bedeutet autoboxing/unboxing zu tun haben, mit Generika? Dies ist nur eine Typ-Frage der Sicherheit. Mit einem non-generic collection, sind Sie verpflichtet, um explizit die Besetzung wieder auf ein Objekt der tatsächlichen Typ. Mit Generika können Sie diesen Schritt überspringen. Ich glaube nicht, dass es einen performance-Unterschied ein oder andere Weise.
Meiner alten Firma tatsächlich berücksichtigt dieses problem. Unser Ansatz war: wenn es leicht zu überarbeiten, tun Sie es; wenn nicht (d.h. es berühren zu viele Klassen), lassen Sie es für einen späteren Zeitpunkt. Es hängt wirklich davon ab, ob oder nicht Sie haben die Zeit, es zu tun, oder ob es mehr sind wichtige Elemente zur Kodierung (d.h. Funktionen, die Sie sollte die Umsetzung für die Kunden).
Dann wieder, wenn Sie nicht arbeiten auf etwas für einen Kunden, gehen Sie vor und verbringen Zeit mit der Umgestaltung. Es werden bessere Lesbarkeit des Codes für dich.
Hängt davon ab, wie viel es da draußen in Ihrem code. Wenn Sie verbindlich oder display-große Listen auf der Benutzeroberfläche, würden Sie wahrscheinlich finden Sie einen großen Gewinn an Leistung.
Wenn die ArrayList nur verspritzt, hier und dort, dann wäre es wahrscheinlich keine große Sache, nur bekommen es gereinigt, aber würde auch nicht auf die Gesamt-performance sehr viel.
Wenn Sie mit einer Menge ArrayLists gesamten code und es wäre eine große untertaking, um Sie zu ersetzen (etwas, was möglicherweise Auswirkungen auf Ihre Zeitpläne), dann könnte man sich verabschieden, wenn-du-touch-it-change-it-Ansatz.
Hauptsache ist jedoch, dass Generika sind viel einfacher zu Lesen, und sind stabiler in der app aufgrund der starken Typisierung, die Sie von Ihnen erhalten. Du wirst sehen, die Gewinne nicht nur aus Leistung, sondern aus code maintainablity und Stabilität. Wenn Sie können, tun Sie es schnell, ich würde sagen, tun Sie es.
Wenn Sie bekommen können buy-in von der Produkt-Besitzer, würde ich empfehlen, immer ist es aufgeräumt. Sie lieben Ihren code mehr danach.
Wenn die Entitäten in die ArrayLists sind Objekttypen, die Sie erhalten etwas von nicht Gießen Sie den richtigen Typ. Wenn Sie die Werttypen (structs oder Grundelemente, wie Int32), dann ist das boxing/unboxing Prozess fügt eine Menge Aufwand, und Generische Auflistungen sollte viel schneller sein.
Hier ist ein MSDN-Artikel zum Thema
Generika hat viel bessere Leistung, vor allem, wenn Sie werden mit Wert-Datentyp (int, bool struct etc.) wo erhalten Sie einen noticeble Leistung zu gewinnen.
Verwendung von Arraylist mit Wert-Typen bewirkt, dass boxing/unboxing, das wenn man mehrere hundert mal ist substantialy langsamer dann mit generischen Liste.
bei der Lagerung von Wert-Typen, die als Objekt-Sie werden bis zu vier mal Speicher pro Element. Während dieser Betrag wird nicht drain Ihre RAM-cache-Speicher, der kleiner ist konnte, enthalten weniger Elemente, Was bedeutet, dass während der Iteration einer langen Sammlungen gäbe es viele Kopien, die aus dem Hauptspeicher in den cache, dass würde langsam Ihre Anwendung.
Schrieb ich über hier.
Verwendung von Generika sollte auch bedeuten, dass dein code wird einfacher und einfach zu bedienen, wenn Sie wollen, zu nutzen, die Dinge wie linq in den späteren c# - Versionen.