14 Stimmen

NHibernate Reflection Optimizer - was macht er?

Ich habe festgestellt, dass die Initialisierung meiner Sitzungsfabrik massiv schneller ist, wenn ich den nhibernate Reflexionsoptimierer deaktiviere. Dies ist großartig für Testzwecke.

<add key="hibernate.use_reflection_optimizer" value="false" />

Meine Frage ist, welche Auswirkungen dies hat, und warum ist es nicht die Standardeinstellung? Alles scheint funktioniert genauso wie bisher.

11voto

fostandy Punkte 4032

Wenn Sie mehr als eine Kopie des einzigen Absatzes über den Reflection Optimizer aus dem Handbuch wünschen, gibt es eine gute Diskussion aquí der Leistungsverbesserungen durch den Reflexionsoptimierer sowie eine kurze Diskussion der Methoden.

Meinem begrenzten Verständnis nach (das kommt alles vom Lesen, keine Experimente meinerseits, also sind Korrekturen willkommen) ist die Kurzfassung, dass es eigentlich zwei Reflexionsoptimierer gibt:

  1. codedom der im Grunde generierter und dann kompilierter Code ist (d.h. nhibernate generiert Wrapper-Getter/Setter-Code für Ihre Entitäten und kompiliert ihn dann). So wie es aussieht, funktioniert dies nur bei öffentlichen Mitgliedern und ist wahrscheinlich extra teuer, weil es naiv die Wrapper-Klassen generiert (unabhängig davon, ob ein bestimmtes Feld öffentlich ist), versucht, sie zu kompilieren, und eine Ausnahme auslöst, wenn dies fehlschlägt.

  2. leichte Codegenerierung , die die okkulte Praxis von reflection.emit nutzt, um Werte zu erhalten/zu setzen. Dies ist noch ein sehr neues Gebiet für mich, aber persönliche Experimente mit ce zeigt, dass Sie SRE verwenden können, um private Variablen sehr schnell zu manipulieren, und die 根源 scheint zumindest die Emission für grundlegende Felder/Eigenschaften unabhängig vom Zugriffsmodifikator zu ermöglichen. Dies ist die Standardeinstellung.

Was den Dominoeffekt betrifft - nun, die glänzenden Grafiken in 1 Wenn Sie während der Entwicklung viele schwere Objekte aufbewahren/befeuchten, könnte das ganz schön ins Gewicht fallen. Wenn nicht (und ich wage die Vermutung, dass Sie nicht während der Test-/Entwicklungsphase), dann scheint es durchaus sinnvoll, es zu deaktivieren.

7voto

Min Punkte 2985

Von der Dokumentation :

Ermöglicht die Verwendung eines zur Laufzeit generierten Klasse zum Setzen oder Abrufen von Eigenschaften einer Entität oder Komponente zu setzen oder zu erhalten, anstatt die Laufzeit-Reflexion (System-Level Eigenschaft). Die Verwendung des Reflection Optimierers verursacht gewisse Startkosten Kosten für die Anwendung, sollte aber langfristig zu einer besseren Leistung führen führen. Sie können diese Eigenschaft nicht in hibernate.cfg.xml oder Abschnitt der der Anwendungskonfigurationsdatei setzen.

3voto

Jeffrey Hines Punkte 1746

Desde https://www.hibernate.org/hib_docs/nhibernate/html/session-configuration.html

Ermöglicht die Verwendung einer zur Laufzeit erzeugten Klasse zum Setzen oder Abrufen von Eigenschaften einer Entität oder Komponente anstelle der Verwendung von Reflexion zur Laufzeit (Eigenschaft auf Systemebene). Die Verwendung des Reflection Optimizer verursacht zwar gewisse Anlaufkosten für die Anwendung, sollte aber auf lange Sicht zu einer besseren Leistung führen. Sie können diese Eigenschaft nicht in hibernate.cfg.xml oder in einem Abschnitt der Anwendungskonfigurationsdatei festlegen.

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