Experimentieren wir mit der Java-Inline-Erweiterung

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.

Was ist Inline-Entwicklung überhaupt?

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.

Experiment

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.

Ergebnis

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.

Referenz

https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html

Recommended Posts

Experimentieren wir mit der Java-Inline-Erweiterung
Lass uns mit Java kratzen! !!
Lassen Sie uns Excel mit Java betreiben! !!
Lassen Sie uns Java studieren
Probieren wir WebSocket mit Java und Javascript aus!
Schreiben wir die Eingabe / Ausgabe von Java-Dateien mit NIO
[LeJOS] Lassen Sie uns den EV3-Motor mit Java steuern
Lassen Sie uns mit Javas Timer einen zeitgesteuerten Prozess erstellen! !!
Installieren Sie Java mit Homebrew
Wechseln Sie die Plätze mit Java
Installieren Sie Java mit Ansible
Bequemer Download mit JAVA
Schalten Sie Java mit direnv
Java-Download mit Ansible
Erstellen Sie Java mit Wercker
Endian-Konvertierung mit JAVA
[Java-Grundlagen] Lassen Sie uns ein Dreieck mit einer for-Anweisung erstellen
[LeJOS] Lassen Sie uns den EV3-Motor mit Java fernsteuern
(Java) Einfache BDD mit Spektrum?
Verwenden Sie Lambda-Ebenen mit Java
Erstellen Sie mit Gradle ein Java-Multiprojekt
Erste Schritte mit Java Collection
Java-Konfiguration mit Spring MVC
Grundlegende Authentifizierung mit Java 11 HttpClient
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
[Vorlage] MySQL-Verbindung mit Java
Schreiben Sie Java Try-Catch mit Optional neu
Installieren Sie Java 7 mit Homebrew (Fass)
[Java] JSON-Kommunikation mit Jackson
Java zum Spielen mit Function
Versuchen Sie eine DB-Verbindung mit Java
Erstaunliche Java-Programmierung (hören wir auf)
Aktivieren Sie Java EE mit NetBeans 9
[Java] JavaConfig mit statischer innerer Klasse
Versuchen Sie gRPC mit Java, Maven
[Form_with] Vereinen wir das Formular mit form_with.
Java-Versionsverwaltung mit SDKMAN
RSA-Verschlüsselung / Entschlüsselung mit Java 8
Paging PDF mit Java + PDFBox.jar
Sortieren Sie Zeichenfolgen als charakteristische Funktion mit Java
Objektorientiert mit Strike Gundam (Java)
[Java] Ersetzen wir Datenobjekte durch einen Mapper ~ BeanMapper Orika ~
[Java] Inhaltserfassung mit HttpCliient
Java-Versionsverwaltung mit jenv
Fehlerbehebung mit Java Flight Recorder
Optimieren Sie Java-Tests mit Spock
Stellen Sie mit Java eine Verbindung zur Datenbank her
Stellen Sie mit Java eine Verbindung zu MySQL 8 her
Fehler beim Spielen mit Java
Verwenden von Mapper mit Java (Spring)
Java Study Memo 2 mit Progate
Erste Schritte mit Java Basics
Saisonale Anzeige mit Java-Schalter
Verwenden Sie SpatiaLite mit Java / JDBC
Lernen von Java mit Progate Note 1
Vergleichen Sie Java 8 Optional mit Swift
HTML-Analyse (Scraping) mit JAVA
Führen Sie Java VM mit Web Assembly aus
Bildschirmübergang mit Swing, Java
Java Unit Test mit Mockito