#devoxxfr – concaténation de strings

Je connais Rémi Forax via une mailing-list ou une autre depuis …au moins 2007 (vérifié dans mes archives mail).

Alors quand il parle, je l’écoute. Et donc, là, il nous parle de la concaténation de chaines en Java8 et Java9.

Donc on prend une concaténation à coups de « + » magiques, et qu’est-ce qu’il se passe ?

D’abord dans le bytecode.

Et Rémi a déja dit basiquement.

Donc en bytecode, ce sont des appels vers des StringBuilder.append (enfin, en Java8).

basiquement.

Mais bon, dixit « le bytecode, c’est relativement marrant à lire, mais en vrai ça sert à rien ». Donc un coup de javap, et nous pouvons voir le bytecode qui sera utilisé sous forme de code Java.

Et comme ça ne sert à rien, passons à l’assembleur. Oui, le vrai assembleur x64 (pas le x86 qui est moins bien).

Et franchement, c’est compliqué.

Maintenant, petit jeu de conversion int=>string. «  »+4 va plus vite que Integer.toString(4) parce que le JIT ne remplit pas le tableau de la chaîne de caractère de 0 avant d’y mettre l’entier !

Comme les optimisations de performances de la JVM sont conçues pour les applications les plus utilisées, il vaut mieux coder crétin comme un Websphere ou un Weblogic 6 plutôt que de faire le mariole.

Et en plus, l’optimisation de toString ne marche vraiment pas toujours. Autrement dit, elle ne marche sûrement pas dans votre code.

Bon, et alors là, basiquement, pour résoudre tout un tas de problèmes d’optimisation de toString, on peut sortir le marteau magique d’invokedynamic pour améliorer le toString.

Et du coup, en Java9, on peut mettre en place toute une série de stratégies de toString selon le contenu.

En plus, on s’est rendu compte en Java8 qu’il y avait plein de strings dans les applications Java. Et du coup, dans G1 en version Java9, il fait de la déduplication de chaînes à la volée. Un peu façon String.intern(), quoi.

Pour continuer avec les détails, les chaînes de caractère Java9 sont maintenant des tableaux de byte. Et je serai tenté de dire que ça va être un beau bazar. Et en fait, c’est le calcul de la valeur du coder (encodage du tableau de bytes) qui va augmenter la taille de l’assembleur.

Ca donne en fait une présentation assez chouette, qui montre encore une fois toute la palette des usages d’invokedynamic.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s