Welche Laufzeitoptimierungen gehen verloren, wenn wir Reflektion verwenden?

9

In dieser Diskussion über den Leistungsaufwand bei der Verwendung von Reflektion heißt es:

  

Die Verwendung der Reflektion kann dazu führen, dass einige Laufzeitoptimierungen verloren gehen. Zum Beispiel wird der folgende Code höchstwahrscheinlich von einer Java Virtual Machine optimiert:

%Vor%      

Äquivalenter Code, der Field.set * () verwendet, darf nicht.

Welche Art von Laufzeitoptimierungen würde ohne Reflektion von JVM vorgenommen?

    
Victor 08.10.2013, 16:53
quelle

2 Antworten

0

Viele JIT-Optimierungen können nicht durchgeführt werden. Schauen Sie sich einfach die JDK-Quelle an, setzen Sie einen Feldwert über die Reflektion, um Sicherheitsprüfungen und einige Suchvorgänge durchzuführen.

Während der Direktzugriff auf primitive Werte, wie von Ihrer Frage umrissen, auf einige Assemblerbefehle beschränkt ist, geben Reflektionsaufrufe dem Optimierer nur sehr wenige Informationen darüber, was vor sich geht, so dass wenig Optimierungen vorgenommen werden können.

Wenn Sie es benchmarken, werden Sie feststellen, dass die Reflexion um eine Größenordnung langsamer ist als "direkter" Code.

    
R.Moeller 08.10.2013, 17:10
quelle
3

In diesem Fall kann der Code verworfen werden, da er scheinbar nichts zu tun hat.

Wenn Sie Reflektion verwendet haben, vermute ich, dass es immer noch etwas tun würde, obwohl Sie nicht auf eine lokale Variable mit Reflektion zugreifen können.

    
Peter Lawrey 08.10.2013 16:56
quelle

Tags und Links