9 Stimmen

Was schneidet am schlechtesten ab: Reflexion oder Boxen?

Ich arbeite daran, mein eigenes DI-Framework zu erstellen, das als Lernübung Delegate Factories erstellt. Meine Art, typisierte Delegaten zu erstellen, besteht darin, Ausdrücke zu verwenden, um eine Funktion zu erstellen, die eine statische Methode mit Verweis auf meinen Container und alle Konstruktorparameter aufruft.

Dies wirft eine interessante Frage in Bezug auf die Werttypen auf. Welcher ist der leistungsfähigste:

a) Mit Hilfe von Reflection eine statische generische Methode mit der richtigen Anzahl von Parametern auswählen und dann MakeGenericMethod verwenden, um die Generika zu entfernen

b) Sie entscheiden sich für das altmodische params Object[] und nehmen die Kosten für das Boxen in Kauf?

18voto

Otávio Décio Punkte 72052

IME ist die Zeit beim Boxen nichts im Vergleich zum Nachdenken.

3voto

Paul Creasey Punkte 27679

Ich würde vermuten, dass die Reflexion sehr viel langsamer wäre, wahrscheinlich um Größenordnungen langsamer.

Es ist aber ziemlich einfach, eine Bank zu bauen. Probieren Sie es aus und posten Sie Ihre Ergebnisse :)

3voto

Bryan Watts Punkte 43539

In diesem Fall wird das Boxen um Größenordnungen schneller sein als die Reflexion.

Natürlich können Sie die Reflexionsergebnisse auch in den Cache stellen.

2voto

nawfal Punkte 65966

Im Allgemeinen Ich würde sagen, selbst wenn das Boxen langsamer gewesen wäre (in einem Maße, das nicht auffällt), ist es der richtige Weg. Reflection ist ein Werkzeug zur Erleichterung einer Art von Meta-Programmierung - wenn Sie einige Arbeit über den Code selbst zu tun haben, und nicht, um Ihre Anwendungen Geschäftslogik zu erleichtern, und daher sollten Sie es nicht ohne guten Grund verwenden. Ein Programmierer sollte zuerst von der physischen Domäne aus denken. Abgesehen davon spielt es in Ihrem Fall wahrscheinlich keine Rolle, da Sie bereits den Weg der Meta-Programmierung eingeschlagen haben. Ich denke . Verwendung von object gibt Ihnen immer noch Kompilierzeitsicherheit bis zu einem gewissen Grad und bessere Wartung .

Wie andere bereits gesagt haben, ist die Reflexion hier der langsamere Weg (es sei denn, Sie verzichten auf den Cache). Eine weitere Sache, die für Boxing spricht, ist, dass Sie sind wahrscheinlich sowieso Boxer, wenn es um die Reflexion geht. . Die Reflection-API befasst sich immer mit object Wenn Sie also einen Instanzwert zurückerhalten, müssen Sie die Box öffnen. Ähnlich, aufrufen GetType auf eine Instanz des Wertetyps zunächst in die Box object was Sie möglicherweise tun müssen, wenn Sie nicht das Argument type, sondern nur die Instanz haben.

Eine bessere Alternative ist es, auf Generika zurückzugreifen. Einige schöne Muster sind detailliert hier.

1voto

supercat Punkte 72939

Wenn man eine Million Elemente verarbeiten muss, ist das Einpacken jedes Elements weniger effizient als die Verarbeitung ohne Einpacken, 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 Artikel eines generischen Typs zu verarbeiten T durch einmalige Verwendung von Reflection, auf Typ T , um ein Objekt zu konstruieren, das etwas vom Typ T ohne zu boxen, und dann das Ergebnis für die Dauer des Programms zwischenzuspeichern. Auf diese Weise können Dinge wie EqualityComparer<T>.Default arbeiten. Ein solcher Ansatz kann leicht um mehr als eine Größenordnung schneller sein als das Einpacken jedes einzelnen Artikels.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X