Expérimentons l'expansion en ligne Java

J'ai entendu dire que les compilateurs JIT font de l'expansion en ligne en Java, mais je voulais expérimenter un peu pour voir à quel point ils en bénéficient.

Qu'est-ce que le développement en ligne en premier lieu?

Pour plus d'informations [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5 Voir% B1% 95% E9% 96% 8B). Le fait est que l'appel d'une méthode a une surcharge, donc si vous incorporez le traitement à l'intérieur de la méthode du côté appelant de la méthode, vous pouvez réduire le coût de l'appel de la méthode. Le compilateur JIT le fait selon les besoins.

Expérience

Le code à essayer cette fois est le suivant. J'ai préparé une méthode qui ajoute simplement une chaîne dans StringBuilder et l'ai appelée à plusieurs reprises. Étant donné que la même méthode est appelée plusieurs fois, j'ai émis l'hypothèse que les performances pourraient différer selon qu'elle est étendue en ligne ou non.

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");
	}
}

Nous avons exécuté ce code avec des modèles d'inlining activés et désactivés pour vérifier les performances. L'intégration est activée par défaut, je l'ai donc désactivée en ajoutant le paramètre VM suivant:

-XX:-Inline

De plus, je l'essaye dans l'environnement de Windows10 et Java15-ea.

résultat

Après avoir essayé 5 fois et pris la moyenne, les résultats suivants ont été obtenus.

Déploiement en ligne activé: 125 ms en moyenne
Expansion en ligne désactivée: 342 ms en moyenne

C'est toute une différence. Cependant, comme la compilation JIT est effectuée pendant l'exécution du programme, elle n'a pas été étendue en ligne depuis le début de l'exécution du programme (j'ai vérifié le journal de l'expansion en ligne avec l'option -XX: + PrintInlining). Ce n'est pas une comparaison très juste à cet égard. Je pense qu'il aurait été préférable d'utiliser l'outil de référence JMH, mais de toute façon, je suis surpris que cette différence puisse être faite.

La taille de la méthode à développer en ligne est

-XX:MaxInlineSize=size

Peut être spécifié par. La valeur par défaut est de 35 octets. Vous pourrez peut-être tirer davantage parti du compilateur JIT en écrivant du code conscient de l'expansion en ligne.

référence

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

Recommended Posts

Expérimentons l'expansion en ligne Java
Raclons avec Java! !!
Exploitons Excel avec Java! !!
Étudions Java
Essayons WebSocket avec Java et javascript!
Écrivons l'entrée / sortie de fichier Java avec NIO
[LeJOS] Contrôlons le moteur EV3 avec Java
Créons un processus chronométré avec la minuterie de Java! !!
Installez java avec Homebrew
Changer de siège avec Java
Installez Java avec Ansible
Téléchargement confortable avec JAVA
Changer java avec direnv
Téléchargement Java avec Ansible
Construire Java avec Wercker
Conversion Endian avec JAVA
[Bases de Java] Créons un triangle avec une instruction for
[LeJOS] Contrôlons à distance le moteur EV3 avec Java
(Java) BDD facile avec Spectrum?
Utiliser des couches Lambda avec Java
Créer un multi-projet Java avec Gradle
Premiers pas avec Java Collection
Configuration Java avec Spring MVC
Authentification de base avec Java 11 HttpClient
Exécuter un lot avec docker-compose avec Java batch
[Template] Connexion MySQL avec Java
Réécrire Java try-catch avec facultatif
Installez Java 7 avec Homebrew (cask)
[Java] Communication JSON avec jackson
Java pour jouer avec Function
Essayez la connexion DB avec Java
Programmation Java incroyable (arrêtons-nous)
Activer Java EE avec NetBeans 9
[Java] JavaConfig avec classe interne statique
Essayez gRPC avec Java, Maven
[Form_with] Unifions le formulaire avec form_with.
Gestion des versions Java avec SDKMAN
Cryptage / décryptage RSA avec Java 8
Pagination de PDF avec Java + PDFBox.jar
Trier les chaînes comme une fonction caractéristique avec Java
Orienté objet avec Strike Gundam (java)
[Java] Remplaçons les objets de données par un mappeur ~ BeanMapper Orika ~
[Java] Acquisition de contenu avec HttpCliient
Gestion des versions Java avec jenv
Dépannage avec Java Flight Recorder
Rationalisez les tests Java avec Spock
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Erreur lors de la lecture avec java
Utilisation de Mapper avec Java (Spring)
Mémo d'étude Java 2 avec Progate
Premiers pas avec les bases de Java
Affichage saisonnier avec commutateur Java
Utiliser SpatiaLite avec Java / JDBC
Étudier Java avec Progate Note 1
Comparez Java 8 en option avec Swift
Analyse HTML (scraping) avec JAVA
Exécuter Java VM avec Web Assembly
Transition d'écran avec swing, java
Test unitaire Java avec Mockito