Frage

ich ständig hören, wie schlecht Reflexion zu verwenden ist. Während ich Reflexion im Allgemeinen vermeiden und nur selten Situationen, wo es unmöglich ist, zu meinem Problem, ohne es zu lösen, ich frage mich ...

Für diejenigen, die Reflexion in Anwendungen verwendet haben, haben Sie die Leistung Hits gemessen und ist es wirklich so schlimm?

War es hilfreich?

Lösung

Es ist. Aber das hängt davon ab, was Sie zu tun versuchen.

I Reflexion verwenden, um dynamisch Baugruppen (Plugins) zu laden und seine Leistung „Strafe“ ist kein Problem, da der Betrieb etwas, das ich während des Starts der Anwendung tun.

Allerdings, wenn Sie in einer Reihe von verschachtelten Schleifen mit Reflexion Anrufen auf jeder reflektierende, ich würde sagen, dass Sie Ihren Code erneut sollten:)

„ein paar Mal“ Operationen, ist die Reflexion durchaus akzeptabel, und Sie werden eine Verzögerung oder ein Problem mit ihm nicht bemerkt. Es ist ein sehr leistungsfähiger Mechanismus und es sogar von .NET verwendet wird, so sehe ich nicht, warum sollten Sie es nicht versuchen.

Andere Tipps

In seinem Vortrag Performance alltäglicher Dinge , Jeff Richter zeigt, dass ein Verfahren, durch Reflexion Aufruf ist über 1000-mal langsamer als es normalerweise aufrufen.

Jeffs Tipp:. Wenn Sie einmal die Methode mehrfach, Reflektion verwenden nennen, es zu finden, weisen Sie es dann zu einem Delegierter , und dann den Delegaten aufrufen

Reflection Leistung hängt von der Implementierung (sich wiederholende Anrufe zwischengespeichert zB werden sollten: entity.GetType().GetProperty("PropName")). Da die meisten der Reflexion ich an einem Tag zu Tag sehe, werden verwendet, Einheiten von Datenlesern oder anderen Repository-Typ Strukturen I speziell auf Benchmark-Performance auf Reflexion entschieden zu füllen, wenn es verwendet wird, um ein Objekte Eigenschaften und festlegen.

erdacht ich einen Test, den ich denke, fair ist, da sie alle die eigentliche SetValue oder GetValue Anruf der Wiederholungsanrufe und nur mal zwischenspeichert. Alle Quellcode für die Performance-Test ist in bitbucket an: https://bitbucket.org/grenade/accessortest. Kontrolle ist willkommen und gefördert werden.

Die Schlussfolgerung, die ich zu gekommen ist, dass es nicht praktikabel ist und nicht spürbare Leistungsverbesserungen nicht bietet Reflexion in einer Datenzugriffsschicht zu entfernen, die weniger als 100.000 Zeilen zu einem Zeitpunkt zurückkehren, wenn die Reflexion Umsetzung gut gemacht ist.

Graph der Zeit (y) gegen Anzahl der Einheiten bevölkert (x)

Die Grafik zeigt, über die Ausgabe meiner kleinen Maßstab und zeigt, dass Mechanismen, die Reflexion übertreffen, erst nach 100.000 Zyklen Marke so deutlich machen. Die meisten DALs nur einige hundert oder vielleicht zu einer Zeit Tausende von Zeilen zurück und auf diesen Ebenen Reflexion führt nur in Ordnung.

Wenn Sie nicht in einer Schleife sind, keine Sorge über sie.

Meine relevanteste Erfahrung wurde das Schreiben von Code aller zwei Dateneinheiten des gleichen Typs in einem großen Objektmodell Eigenschaft weise zu vergleichen. Habe es funktioniert, versuchte es, wie ein Hund lief, offensichtlich.

Ich war mutlos, dann erkannte über Nacht, daß wihout die Logik zu ändern, ich den gleichen Algorithmus verwenden könnte, um Methoden automatisch generieren, um den Vergleich zu tun, sondern statisch die Eigenschaften zugreifen. Es dauerte keine Zeit überhaupt den Code für diesen Zweck anzupassen, und ich hatte die Fähigkeit, tiefen Eigenschaft weist Vergleich von Entitäten mit statischem Code zu tun, die an dem Klick auf eine Schaltfläche aktualisiert werden konnten, wenn das Objektmodell geändert.

Mein Punkt ist: In Gesprächen mit Kollegen, da ich mehrmals darauf hingewiesen, dass die Verwendung der Reflexion sein könnte Code automatisch zu generieren und nicht zu kompilieren als Runtime-Operationen durchführen und das ist oft eine Überlegung wert

.

Nicht massiv. Ich habe noch nie ein Problem mit ihm in Desktop-Entwicklung hatte, es sei denn, wie Martin sagt, du bist es in eine dumme Lage mit. Ich habe eine Menge Leute gehört hat völlig irrationale Ängste über seine Leistung in Desktop-Entwicklung.

In der Compact Framework (was ich bin in der Regel in) aber es ist ziemlich viel Anathema rel="nofollow und sollte wie die Pest in den meisten Fällen vermieden werden. Ich kann immer noch mit der Verwendung es selten weg, aber ich habe mit der Anwendung wirklich vorsichtig sein, die Art und Weise ist weniger Spaß. : (

Es ist schlimm genug, dass man auch über Reflexion besorgt werden muß intern von den .NET-Bibliotheken für leistungskritische Code.

Das folgende Beispiel ist veraltet - wahr zu der Zeit (2008), aber schon vor langer Zeit in der neueren CLR-Versionen behoben. Reflexion im Allgemeinen ist immer noch ein wenig teuer Sache, aber!

Typischer Fall: Sie sollen nie Mitglied erklärt als "Objekt" in einem Schloss (C #) / SyncLock (VB.NET) Aussage in High-Performance-Code verwenden. Warum? Da die CLR kann auf einen Werttyp nicht sperren, was bedeutet, dass es eine Laufzeitreflexionstypprüfung zu tun hat, um zu sehen, ob Ihr Objekt ist eigentlich ein Werttyp anstelle eines Referenztyp.

Wie bei allen Dingen in der Programmierung haben Sie die Leistung Kosten zum Ausgleich mit mit jedem Vorteile gewonnen. Reflexion ist ein sehr wertvolles Werkzeug, wenn sie mit Vorsicht verwendet. Ich habe eine O / R-Mapping-Bibliothek in C #, die Reflexion verwendet, um die Bindungen zu tun. Das funktionierte fantastisch gut. Die meisten der Reflexions Code wurde nur einmal ausgeführt, so dass jeder Performance Hit war recht klein, aber die Vorteile waren groß. Wenn ich einen neuen Fandangled Sortieralgorithmus geschrieben haben, würde ich wahrscheinlich verwenden Reflexion nicht, da es wahrscheinlich schlecht wäre skalieren.

Ich schätze, dass ich nicht genau Ihre Frage hier beantwortet. Mein Punkt ist, dass es nicht wirklich wichtig. Verwenden Reflexion gegebenenfalls. Es ist nur eine andere Sprache-Funktion, die Sie lernen müssen, wie und wann zu verwenden.

Reflexion kann spürbare Auswirkungen auf die Leistung haben, wenn Sie es für häufige Objekterstellung verwenden. Ich habe Anwendung entwickelt, basierend auf Composite-UI-Anwendungs Block , die stark auf Reflexion setzt. Es war eine deutliche Leistungsverschlechterung mit Objekten Erstellung über Reflexion Zusammenhang stehen.

Doch in den meisten Fällen gibt es keine Probleme mit der Reflexion Nutzung. Wenn Ihr nur Notwendigkeit, einige Montage zu prüfen ist, würde ich empfehlen Mono.Cecil die sehr leicht und schnell

Die Reflexion ist teuer wegen der vielen überprüft die Laufzeit machen müssen, wenn Sie eine Anfrage für ein Verfahren zu machen, die eine Liste von Parametern übereinstimmt. Irgendwo tief im Inneren existiert Code, die Schleifen über alle Methoden für einen Typ, seine Sichtbarkeit überprüft, überprüft den Rückgabetyp und auch überprüft den Typ eines jeden Parameters. All diese Sachen kostet Zeit.

Wenn Sie diese Methode intern ausführen Theres einige Code, der Sachen tut, wie Sie die Kontrolle einer kompatiblen Parameterliste übergeben, bevor die eigentliche Zielmethode ausgeführt wird.

Wenn möglich, ist es immer empfehlenswert, dass man das Verfahren handelte Caches, wenn man geht, um es ständig in der Zukunft wiederverwenden. Wie alle guten Programmiertipps, macht es oft sinnvoll, zu wiederholen, sich selbst zu vermeiden. In diesem Fall wäre es verschwenderisch sein, kontinuierlich die Methode mit bestimmten Parametern Nachschlag und führen Sie es dann jeden und jedes Mal.

Poke um die Quelle und werfen Sie einen Blick auf was getan wird.

Wie bei allem, geht es um die Situation zu beurteilen. In DotNetNuke gibt es eine ziemlich Kernkomponente namens FillObject, die Reflexion zu füllen Objekte aus datarows verwendet.

Dies ist ein recht häufiges Szenario und es ist ein Artikel auf MSDN, Verwendung von Reflection Business Objects zu binden ASP.NET Form Controls , die die Performance-Probleme abdeckt.

Performance beiseite, eine Sache, Ich mag nicht über Reflexion in diesem speziellen Szenario ist, dass es die Fähigkeit zur Verringerung neigt dazu, den Code auf einem schnellen Blick, die für mich zu verstehen, nicht die Mühe wert scheint, wenn man man bedenkt, verlieren auch Zeit Sicherheit kompilieren wie wie LINQ to SQL .

Reflection verlangsamt nicht drastisch die Leistung Ihrer App. Sie können bestimmte Dinge schneller, indem keine Reflexion der Lage zu tun, aber wenn Reflexion der einfachste Weg ist, einige Funktionen zu erreichen, dann verwenden. Sie können Sie immer Refactoring-Code von Reflexion weg, wenn es ein perf Problem wird.

Ich glaube, Sie werden feststellen, dass die Antwort, es hängt davon ab. Es ist keine große Sache, wenn Sie es in Ihrer Aufgabenlistenanwendung setzen wollen. Es ist eine große Sache, wenn Sie es in Facebook-Persistenz-Bibliothek setzen wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top