dimanche 3 juillet 2016

Short String Optimisation

Enfin, ayant pu mettre la main sur la version 5.2 de gcc, m'empressais-je d'expérimenter un petit peu avec les short string optimisation (SSO), cette nouvelle implémentation de la classe std::string qui permet une grande amélioration des performances et de la mémoire pour la gestion des chaînes de caractères courtes. Historiquement, gcc implémentait std::string avec une autre optimisation, le "copy on write", qui est plus intéressant pour les grandes chaînes de caractères, mais de nouvelles contraintes dans le standard C++11 interdisent cette optimisation, et gcc doit donc passer à SSO.

Le principe est diablement intelligent: la classe std::string est typiquement implémentée avec un pointeur, vers l'espace mémoire alloué sur le tas et qui contient la chaîne en elle-même, et un entier correspondant à la taille de cette chaîne. L'idée est donc de dire que si la chaîne est suffisamment petite, plutôt que de l'allouer sur le tas, autant utiliser directement les octets du pointeur et de l'entier, en considérant le pointeur et l'entier comme un tableau de caractères.

Détails d'implémentation mis à part, cela nous donne effectivement un maximum de 15 octets (en 64 bits) sans aucune allocation. Et, sur certains programmes, cela fait une différence très significative.

Sur mon programme de test, qui est un générateur de code, c'est à dire un programme qui par définition passe sa vie à allouer des chaînes, l'on a diminué de moitié le nombre d'allocations, et diminué de moitié le temps d'exécution. Sur des programmes moins spécialisés, la différence est moins spectaculaire, mais cela reste très intéressant.

Alors, le souci est que cela casse la compatibilité binaire, et qu'il faut donc recompiler son programme toutes ses dépendances, ce qui, dans un environnement corporate avec des logiciels tiers propriétaires, peut poser des soucis. Mais si l'on peut, alors cela vaut vraiment le coup.