Ich arbeite daran, mein eigenes DI-Framework zu erstellen, das Delegiertenfabriken als Lernübung erstellt. Meine Art, typisierte Delegierte zu erstellen, besteht darin, mithilfe von Ausdrücken eine Funktion zu erstellen, die eine statische Methode mit Bezug auf meinen Container und alle Konstruktorparameter aufruft.
Dies warf eine interessante Frage hinsichtlich der Werttypen auf. Welches ist das leistungsfähigste:
a) Verwenden Sie reflection, um eine statische generische Methode mit der richtigen Anzahl von Parametern auszuwählen, und verwenden Sie dann MakeGenericMethod, um die Generics zu entfernen
b) Gehen Sie für die alten Mode-Parameter Objekt [] und nehmen Sie den Schlag auf Boxen?
Ich würde vermuten, dass die Reflexion viel langsamer wäre, wahrscheinlich Ordnungen von Magintude.
Es ist ziemlich einfach zu bench, aber probiere es aus und poste deine Ergebnisse:)
In diesem Fall ist das Boxen um Größenordnungen schneller als die Reflexion.
Natürlich können Sie die Reflexionsergebnisse immer zwischenspeichern.
Im Allgemeinen würde ich sagen, selbst wenn das Boxen langsamer gewesen wäre (in gewissem Maße nicht bemerkbar), ist es der richtige Weg. Reflection ist ein Werkzeug, um eine Art Meta-Programmierung zu ermöglichen - wenn Sie etwas über den Code selbst hinaus arbeiten müssen und die Geschäftslogik Ihrer Anwendungen nicht vereinfachen sollten, und deshalb sollten Sie sie nicht ohne guten Grund verwenden. Ein Programmierer sollte zuerst von der physischen Domäne denken. Das heißt, in Ihrem Fall ist es wahrscheinlich egal, da Sie bereits den Meta-Weg gehen ich denke . Wenn Sie object
verwenden, erhalten Sie Zeit für die Kompilierungszeit und bessere Wartung .
Wie andere schon gesagt haben, ist die Reflexion hier die langsamere (außer Sie cachen nicht). Eine andere Sache, die zum Vorteil des Boxens kommt, ist, dass du wahrscheinlich sowieso Boxen bist, wenn du mit Reflektion arbeitest. Die Reflection-API behandelt immer object
. Wenn Sie also einen Instanzwert zurückerhalten, müssen Sie die Box aufheben. Ebenso Aufruf von GetType
Bei einer Instanz des Wertetyps wird sie zuerst in object
eingeschlossen, was möglicherweise erforderlich ist, wenn Sie nicht das Argument type, sondern nur die Instanz haben.
Aber eine bessere Alternative ist, sich auf Generika zu verlassen. Einige schöne Muster sind hier
Wenn man eine Million Elemente verarbeiten muss, ist das Boxen jedes Elements weniger effizient als die Verarbeitung ohne Boxing, aber viel schneller als die Verwendung von Reflection zur Verarbeitung des Typs jedes Elements.
Andererseits wird es in vielen Szenarien möglich sein, eine Million Elemente eines generischen Typs T
zu verarbeiten, indem Sie einmal Reflection am Typ T
verwenden, um ein Objekt zu konstruieren, das etwas vom Typ% co_de verarbeiten kann % ohne Boxen, und dann das Ergebnis davon für das Leben des Programms zwischenspeichern. So funktionieren Dinge wie T
. Solch ein Ansatz kann leicht mehr als eine Größenordnung schneller sein als das Boxen jedes Gegenstandes.
Tags und Links .net c# reflection performance boxing