Methodenreferenz-Caching in Java 8
In Java 8 wurden Methodenreferenzen eingeführt, die eine präzise Syntax für die Referenzierung von Instanzmethoden und Konstruktoren bereitstellen. Es bestehen jedoch Bedenken, ob das Zwischenspeichern dieser Referenzen von Vorteil ist. Um dieses Thema zu verstehen, ist es wichtig, zwischen dem Caching von Methodenreferenzen für häufige Ausführungen derselben Aufruf-Site und deren Zwischenspeicherung für die mehrfache Verwendung einer Methodenreferenz durch verschiedene Aufruf-Sites zu unterscheiden.
Methodenreferenz-Caching für die gleiche Aufrufseite
Betrachten Sie den folgenden Code, in dem Foo.func() wiederholt aufgerufen wird doSomethingWithAFunc():
class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } }
Das Zwischenspeichern von this::func würde angeblich die Erstellung neuer anonymer Klasseninstanzen bei jeder Ausführung von hotFunction() verhindern. Die JVM optimiert dieses Szenario jedoch bereits, indem sie die beim ersten Aufruf des Lambda erstellte Call-Site-Instanz wiederverwendet. Das Zwischenspeichern der Methodenreferenz ist in diesem Fall überflüssig.
Methodenreferenz-Caching für verschiedene Call-Sites
Betrachten Sie im Gegensatz dazu das folgende Beispiel:
Runnable r1 = System::gc; Runnable r2 = System::gc;
Hier erzeugen zwei verschiedene Aufrufseiten Methodenverweise auf dieselbe Zielmethode System.gc() in java.lang.System. Die JVM darf eine einzelne Lambda-Instanz gemeinsam nutzen, die aktuelle Implementierung in Java 8 sieht dies jedoch nicht vor. Dies liegt an den ungewissen Leistungsvorteilen der Verwaltung eines Caches von Lambda-Instanzen.
Best Practices
Angesichts dieser Überlegungen wird es im Allgemeinen nicht empfohlen, Methodenverweise zwischenzuspeichern, sofern sie nicht vorhanden sind Dabei handelt es sich um spezifische Leistungsprobleme, die durch Messungen identifiziert wurden. Caching kann möglicherweise das Programmausführungsverhalten verändern und sollte nur in den folgenden Fällen in Betracht gezogen werden:
Wenn die Lambda wird im Konstruktor oder bei der Klasseninitialisierung erstellt und:
Das obige ist der detaillierte Inhalt vonBietet Methodenreferenz-Caching in Java 8 Leistungssteigerungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!