Leistung von Set und Get mit Reflection

8

Führt das Festlegen und Abrufen eines Objektattributs mithilfe der Reflektion ( java.lang.reflect.Field get und set -Funktionen) anstelle des Aufrufs von set und get des Objekts selbst zu erheblichen Leistungsunterschieden?

    
MBZ 21.10.2012, 08:05
quelle

3 Antworten

13

Ja - absolut. Eine Klasse durch Reflektion nachzuschlagen, ist um ein Vielfaches teurer Zitieren von Java-Dokumentation

Da bei der Reflektion Typen verwendet werden, die dynamisch aufgelöst werden, können bestimmte Java Virtual Machine-Optimierungen nicht durchgeführt werden. Folglich haben reflektive Operationen eine geringere Leistung als ihre nicht reflektierenden Gegenstücke und sollten in Codeabschnitten vermieden werden, die häufig in performance-sensitiven Anwendungen aufgerufen werden.

    
Sandeep 21.10.2012, 08:10
quelle
6

Ja, der Benchmark ist in 15 Minuten einfach zu schreiben.

Generierter Code ist besser, selbst wenn Sie die reflektiven Accessoren zwischenspeichern, habe ich es versucht.

Hier ist es unter Java 7 64 Bits:

%Vor%

Ergebnis:

%Vor%

Ratio ist in der Nähe von 1870 w / o barrierefrei gesetzt. Wenn Sie es einstellen, sinkt das Verhältnis auf 83.

    
Aubin 21.10.2012 08:08
quelle
0

Ja, es macht einen erheblichen Leistungsunterschied, und es gibt eine Menge Benchmarking-Ergebnisse im Internet, um dies zu unterstützen.

Zum Beispiel: Ссылка - was scheint zu sagen, dass ein reflektierender Aufruf an Eine Methode get oder set ist ~ 50 mal langsamer als direkt auf das Feld zuzugreifen / zu aktualisieren. (Und das Abrufen / Setzen mit Field Methoden ist noch langsamer.)

Nun sind diese Ergebnisse ziemlich alt und (scheinbar) wurde die Leistung der Reflektion in den letzten HotSpot JVMs verbessert. Eine grobe Faustregel ist jedoch "eine Größenordnung oder mehr langsamer".

    
Stephen C 21.10.2012 08:28
quelle

Tags und Links