Ich habe gehört, dass JIT-Compiler eine Inline-Erweiterung in Java durchführen, aber ich wollte ein wenig experimentieren, um zu sehen, wie sehr sie davon profitieren.
Weitere Informationen [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5 Siehe% B1% 95% E9% 96% 8B). Der Punkt ist, dass das Aufrufen einer Methode einen Overhead hat. Wenn Sie also die Verarbeitung in die Methode auf der Aufruferseite der Methode einbetten, können Sie die Kosten für das Aufrufen der Methode reduzieren. Der JIT-Compiler führt dies nach Bedarf aus.
Der Code, um diesmal zu versuchen, lautet wie folgt. Ich habe eine Methode vorbereitet, die nur einen String in StringBuilder anfügt und ihn wiederholt aufruft. Da dieselbe Methode oft aufgerufen wird, habe ich angenommen, dass die Leistung je nachdem, ob sie inline erweitert wird oder nicht, unterschiedlich sein kann.
InlineSample.java
public class InlineSample {
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10_000_000; i++) {
appendHoge(builder);
}
System.out.println(builder.length());
long end = System.currentTimeMillis();
System.out.println("elapsed " + (end - start) + " ms");
}
private static void appendHoge(StringBuilder builder) {
builder.append("hoge");
}
}
Wir haben diesen Code mit aktivierten und deaktivierten Inlining-Mustern ausgeführt, um die Leistung zu überprüfen. Inlining ist standardmäßig aktiviert, daher habe ich es durch Hinzufügen des folgenden VM-Parameters deaktiviert:
-XX:-Inline
Außerdem versuche ich es in der Umgebung von Windows10 und Java15-ea.
Nach fünfmaligem Versuch und Ermittlung des Durchschnitts wurden die folgenden Ergebnisse erhalten.
Inline-Bereitstellung EIN: Durchschnittlich 125 ms
Inline-Erweiterung AUS: Durchschnittlich 342 ms
Es ist ein ziemlicher Unterschied. Da die JIT-Kompilierung jedoch während der Programmausführung durchgeführt wird, wurde sie vom Beginn der Programmausführung an nicht inline erweitert (ich habe das Protokoll der Inline-Erweiterung mit der Option -XX: + PrintInlining überprüft). Diesbezüglich ist es kein sehr fairer Vergleich. Ich denke, es wäre besser gewesen, das Benchmark-Tool JMH zu verwenden, aber ich bin trotzdem überrascht, dass dieser Unterschied gemacht werden kann.
Die Größe der Methode, die inline erweitert werden soll, ist
-XX:MaxInlineSize=size
Kann angegeben werden durch. Der Standardwert beträgt 35 Byte. Möglicherweise können Sie mehr vom JIT-Compiler profitieren, indem Sie Code schreiben, der sich der Inline-Erweiterung bewusst ist.
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html
Recommended Posts