"Hotspot kann Grenzen in Java entfernen." Kann das bitte jemand erklären? Im Moment analysiere ich die Unterschiede zwischen C ++ und Java. Es ist keine Hausaufgabe und ich analysiere mein eigenes Interesse.
Nach dem googeln von "hotspot bounds checking", einem Paper mit dem Titel "Array Bounds Eliminierung für den Java HotSpot ™ Client entfernen Compiler " erscheint (als erstes Ergebnis) und gibt uns einen Einblick:
Zusammenfassung:
Immer wenn auf ein Array-Element zugegriffen wird, Java Virtual Machines führen ein Vergleichen Sie die Anweisung, um sicherzustellen, dass die Indexwert ist innerhalb des gültigen Grenzen. Dies reduziert die Ausführung Geschwindigkeit von Java-Programmen. Array-Grenzen Check Eliminierung identifiziert Situationen, in denen solche Überprüfungen stattfinden redundant und kann entfernt werden. Wir Präsentieren Sie eine Überprüfung der Array-Grenzen Eliminierungsalgorithmus für Java HotSpot ™ VM basiert auf statischer Analyse im Just-in-Time-Compiler.
Der Algorithmus arbeitet an einem Zwischenprodukt Darstellung in statischem Single Zuordnungsformular und pflegt Bedingungen für Indexausdrücke. Es entfernt Grenzen vollständig, wenn es möglich ist bewiesen werden, dass sie niemals versagen. Wann immer es möglich ist, bewegt es sich Grenzen Auschecken von Schleifen. Die statische Nummer der Schecks bleibt gleich, aber a Überprüfen Sie innerhalb einer Schleife ist wahrscheinlich häufiger ausgeführt. Wenn eine solche Überprüfung fehlschlägt, fällt das ausführende Programm Zurück zum interpretierten Modus, Vermeiden des Problem, auf das eine Ausnahme geworfen wird der falsche Ort.
Die Auswertung zeigt eine Beschleunigung nahe bei das theoretische Maximum für die wissenschaftliche SciMark-Benchmark-Suite (Durchschnittlich 40%). Der Algorithmus auch verbessert die Ausführungsgeschwindigkeit für die SPECjvm98 Benchmark - Suite (2% auf Durchschnitt, 12% maximal).
Mark Mayo hat das schön erklärt.
Unterste Zeile: Wenn Hotspot feststellt, dass es nicht notwendig ist, Grenzen für ein Array zu prüfen, sieht es dies als eine Möglichkeit, die Grenzen für dieses Array zu deaktivieren und somit die Leistung zu erhöhen.
Nun, es funktioniert, indem es die Leistung des Programms ständig analysiert und nach "Hotspots" sucht, die häufig oder wiederholt ausgeführt werden können. Diese werden dann zur Optimierung für eine hochperformante Ausführung mit minimalem Overhead für weniger performancekritisches Code.
Wenn also in der Theorie einige Grenzen überprüft werden und es durch wiederholte und häufige Ausführung offensichtlich ist, dass es unmöglich ist, die Grenzen zu überschreiten, können Hotspots diese Prüfungen optimieren. Es bedeutet nicht, dass es unfehlbar ist, aber das könnte ein Grund sein, warum es passiert.
Aus einem Artikel aus dem Jahr 2007 von Würthinger et al.: "Immer wenn auf ein Array-Element zugegriffen wird, Java virtual Maschinen führen eine Vergleichsanweisung aus, um sicherzustellen, dass der Indexwert innerhalb der gültigen Grenzen liegt. Dies reduziert die Ausführungsgeschwindigkeit von Java-Programmen. Die Array-Grenzen-Prüfeliminierung identifiziert Situationen, in denen solche Prüfungen redundant sind und entfernt werden können Algorithmus für die Java HotSpot ™ VM basiert auf der statischen Analyse im Just-in-Time-Compiler. "
Tags und Links java jvm-hotspot runtime bounds-check-elimination