Warum werden Java 8 Lambda-Ausdrücke aufgerufen, mit invokedynamic?

Den invokedynamic Anweisung wird verwendet, um die VM bestimmen Sie die Methode, die die Referenz zur Laufzeit statt festverdrahtung es zur compile-Zeit.

Dies ist sinnvoll, mit dynamischen Sprachen, wo die genaue Methode und argument-Typen sind nicht bekannt, erst zur Laufzeit. Aber das ist nicht der Fall mit Java Lambda-Ausdrücke. Sie übersetzt werden, um eine statische Methode mit klar definierten Argumenten. Und diese Methode kann aufgerufen werden, mit invokestatic.

Also, was ist die Notwendigkeit von invokedynamic für Lambda-Ausdrücke, vor allem, wenn es zu einem Leistungseinbruch?

Brian Goetz, erklärt es hier: wiki.jvmlangsummit.com/images/1/1e/2011_Goetz_Lambda.pdf
invokedynamic ist nicht gebrauchte to invoke lambda, aber zu schaffen und binden ein MethodHandle zu lambda-Körper in der gegebenen call Website.
Indy wird verwendet, um capture der lambda, nicht aufgerufen werden können.
Wir verwenden invokedynamic weil es eine Leistung Verbesserung, nicht zu einem Leistungseinbruch, der über das "offensichtliche" übersetzung Systeme. (Ich weiß nicht, Woher Sie die Idee, dass es zu einem Leistungseinbruch, aber das ist falsch.)
Es ist performance-test auf stackoverflow.com/questions/19001241/...: "Die Quintessenz ist, dass die post die JIT-Kompilierung, Lambda-Ausdrücke und anonyme Klassen führen in ähnlicher Weise auf aktuelle Hostpot JVM-Implementierungen".

InformationsquelleAutor Kshitiz Sharma | 2015-05-02

Schreibe einen Kommentar