Optimiert Java Methodenaufrufe über eine Schnittstelle, bei der ein einzelnes Implementor als final markiert ist?

8

Wenn ich einen Verweis auf eine Klasse habe und eine Methode darauf aufruft und die Klasse oder Methode endgültig ist, verstehe ich, dass der Compiler oder die JVM den dynamischen Versand durch einen billigeren statischen Versand ersetzen würde, da er feststellen kann genau welche Version würde aufgerufen werden.

Was aber, wenn ich einen Verweis auf eine Schnittstelle habe und die Schnittstelle derzeit nur einen einzigen Implementor hat, und dass der Implementor final ist oder die Methode in diesem Implementor final ist, kann die JVM dies zur Laufzeit herausfinden und diese optimieren Anrufe?

    
Uri 10.06.2009, 03:02
quelle

4 Antworten

11

(Fügen Sie Knuth hier ein Zitat zur Optimierung ein.)

Siehe Wikis Home & gt; HotSpot Internals für OpenJDK & gt; Performancetechniken .

  
  • Methoden sind oft inline. Dies erhöht den "Horizont" des Compilers   Optimierung.
  •   
  • Statische, private, endgültige und / oder "spezielle" Aufrufe sind einfach zu machen   inline.
  •   
  • Virtuelle (und Schnittstellen-) Aufrufe werden oft zu "speziell" degradiert   Aufrufe, wenn die Klassenhierarchie   erlaubt es. Eine Abhängigkeit wird registriert   falls weitere Klassenbelastungen verderben   Dinge.
  •   
  • Virtuelle (und Schnittstellen-) Aufrufe mit einem einseitigen Typprofil sind   kompiliert mit einem optimistischen Check-in   Bevorzugung des historisch gebräuchlichen Typs   (oder zwei Arten).
  •   

Es gibt einige interessante Links von Inlining .

    
Eugene Yokota 10.06.2009, 03:16
quelle
0

AFAIK, die JVM kann bis zu zwei Methoden einreihen, die Methoden müssen nicht endgültig sein. Es kann dies tun, wenn die Methoden klein sind und oft aufgerufen werden. Wenn Ihr Code drei oder mehr Methoden aufruft, werden nur die am häufigsten aufgerufenen Methoden aufgerufen.

Hinweis 1: Der JVM ist es egal, wie viele Implementierungen es gibt, nur wie viele tatsächlich aufgerufen werden.

Hinweis 2: Die JVM kann Inline-Methoden verwenden, die zum Zeitpunkt der Kompilierung nicht existierten, es kommt nur auf den zur Laufzeit verfügbaren Code an.

    
Peter Lawrey 11.06.2009 20:16
quelle
0

Die Java Virtual Machine ab heute kümmert sich nicht mehr um das Schlüsselwort "final" (nur für Klassenzusicherungen). Alles wird als endgültig betrachtet, es sei denn, es wird eine Klasse geladen, die die angegebene Funktion überschreibt oder im Falle einer Schnittstelle eine andere Implementierung bereitstellt.

Dies führt zu mehreren Code-Kompilierungen, wenn Klassen zur Laufzeit dynamisch geladen werden, nachdem der JIT-Compiler bereits etwas kompiliert hat, das als endgültig angesehen wurde, aber die Gewinne scheinen den Aufwand zu beeinträchtigen.

Ich habe keinen Link zu der Zeitung darüber, aber ich habe es vor einigen Wochen gelesen (und vielleicht ist es nur in Java 7 so).

    
Daniel Migowski 11.06.2009 20:23
quelle
-1

Der JIT-Compiler kann das nicht, da es durchaus üblich ist, zur Laufzeit Proxies für Interfaces zu erstellen, damit der JIT-Compiler niemals sicher sein kann, dass es keinen dynamischen Proxy gibt, der eine bestimmte Schnittstelle implementiert. p>     

pmf 10.06.2009 03:27
quelle

Tags und Links