Einige JVMs kompilieren Java-Bytecode in nativen Maschinencode. Wir wissen, dass wir dafür viele Optimierungen anwenden können. Kürzlich habe ich auch erfahren, dass eine Verzweigungsoperation die CPU blockieren und die Leistung erheblich beeinträchtigen kann, wenn eine CPU eine falsche Vorhersage macht.
Weiß jemand, ob eine JVM Maschinencodes für die CPU einfacher generieren würde, um anhand der gesammelten Laufzeitstatistiken die richtige Vorhersage zu treffen?
Antworten:
Nein, HotSpot fügt dem Hardwarezweig-Prädiktor keine Hinweise hinzu, wie in der OpenJDK-Mailingliste angegeben :
quelle
Ich vermute, dass Vorhersagehinweise auf der Ebene der Maschinenbefehle bestenfalls ein Rauschen und im schlimmsten Fall ein Nachteil (verschwendete Befehlsbytes) für eine moderne, nicht in Ordnung befindliche, spekulativ ausführende Architektur sind. Dies wäre so, als würde man der CPU sagen, sie solle dumm sein - damit sie ihre bereits intelligenten Dinge nicht mehr tut, für die sie entwickelt wurde.
Zweitens hängt das Ausmaß, in dem die Verzweigungsvorhersage verbessert werden kann, von der Ursache der Fehlvorhersage und der Leichtigkeit ab, mit der man die Leistungseffekte der Verzweigung messen oder die Tendenz der Verzweigung beobachten kann.
Ich denke jedoch, dass die vorhandene Menge an JIT-Optimierungstricks die Verzweigungsvorhersage bereits bis zu einem gewissen Grad verbessern kann, auch ohne die Hilfe von Zählern für die falsche Vorhersage von CPU-Verzweigungen.
Nur ein sehr einfaches Codebeispiel:
Angenommen, das
repeatHistory
wird oft genannt. Wenn der auf Stichproben basierende Leistungsmonitor die Anrufstapelstatistik analysiert, kann er feststellen, dassrepeatHistory()
Anrufe aus irgendeinem Grundratifying()
häufiger auftreten als beim vorherigen Aufruflanding()
. Basierend auf dieser Beobachtung wird dies beim nächsten Durchlauf der JIT-Codegenerierung für dierepeatHistory
Methode berücksichtigt und eine oder mehrere Optimierungen durchgeführt:(value == 1776)
vor den Scheck für(value == 1492)
ratifying()
Methode in den Zweig in zu integrierenrepeatHistory()
repeatHistory()
von einer anderen Schleife aufgerufen wird, versuchen Sie, die Schleife abzuwickeln, oder fügen Sie dierepeatHistory()
Methode in diese Schleife ein.Nach dem Anwenden einer Optimierung muss häufig erneut analysiert werden, ob weitere Optimierungen angewendet werden können, da eine erfolgreiche Optimierung häufig die Tür zu mehr Möglichkeiten öffnet.
quelle