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.
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.
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.
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.
https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/java.html
Recommended Posts