Hotspot-Optimierung
| '' ACHTUNG: Dieser Artikel bedarf dringend einer Überarbeitung. Wenn du Lust hast, beteilige dich daran und entferne diesen Baustein, wenn du den Artikel verbessert hast. |
Bei der Hotspot-Optimierung handelt es sich um eine Optimierungs-Technik, welche bei JIT-Compilern Verwendung findet und das Laufzeitverhalten von Software während der Ausführung erheblich verbessert.
Als Hotspots bezeichnet man während der Laufzeit eines Programms oft durchlaufene Code-Abschnitte. Der Hotspot-Compiler versucht das Verhalten erkannter Hotspots zu verbessern indem er einerseits klassische Optimierungstechniken, welche auch bei statischen Compilern vorkommen, und andererseits dynamische Optimierungen auf diese anwendet und den restlichen Code normal compiliert oder nur interpretiert.
Diese selektive Optimierung hat den Vorteil, dass nicht so viel Ressourcen für das Kompilieren aufgewendet werden müssen, wie bei einem normalen JIT-Compiler, aber häufig abgearbeitet Code-Abschnitte trotzdem das Laufzeitverhalten nicht negativ beinträchtigen, wie bei einem Interpreter. Ein Hotspot-Compiler vereinigt somit die Vorteile eines Interpreters (schneller Startup) mit denen eines JIT-Compilers (schnelles Laufzeitverhalten).
Das Dynamo-Projekt von Hewlett-Packard hat gezeigt, dass Hotspot-Optimierter Code in einigen Fällen (obwohl mehrheitlich interpretiert) performanter sein kann, als das entsprechende statisch compilierte Programm.
Beispiel in Java
int x;
int y;
for (int i=0;i<1000;i++) {
x = 10 + 10;
y = x +i;
}
Ein Java-Compiler übersetzt dieses Konstrukt normalerweise ohne weitere Optimierung in Bytecode. Eine JVM, die mit JIT und Hotspot-Optimierung arbeitet, übersetzt den Bytecode zuerst in nativen Code der jeweiligen Plattform. Nach einigen Durchläufen wird der Hotspot-Optimierer erkennen, dass der Wert von x nicht durch die Laufvariable i beeinflusst wird - er wird also die Berechnung von x vor die Schleife ziehen und damit einige Prozessorzyklen pro Durchlauf einsparen. Diese spezielle Optimierung hätte natürlich auch durch den Programmierer oder den Compiler stattfinden können und ist deswegen wirklich nur als Beispiel zu verstehen. In der Tat ist es sogar so, dass ein hochoptimierender Compiler den Wert von y schon zum Zeitpunkt der Übersetzung komplett ausrechnen und als konstanten Wert einsetzen würde.