lundi 7 juillet 2014

Goooooold linker!!!!!

C'est sous ce nom très JamesBondien que se cache un nouvel éditeur de liens, développé par Google (Gold = Google ld), avec comme but de meilleures performances lors de la compilation de grosses solutions, en remplacement du vénérable ld.

Gold est optimisé pour la vitesse. Lier de grosses bibliothèques ou de gros exécutables est donc nettement plus rapide. Sur une de nos bibliothèques mammouth (1 GB avec les informations de débug), l'édition de liens est passée de 1 minute à 40 secondes, ce qui est très agréable lorsque l'on doit effectuer cette opération des dizaines de fois par jour.

Gold permet d'effectuer l'édition de liens de manière incrémentale. En construisant le binaire de manière à laisser de l'espace autour des unités de compilation, l'éditeur de liens peut simplement remplacer le bout qui a changé et garder le reste. Cette fonctionnalité m'intéresse particulièrement: très souvent, je fais un changement trivial dans un fichier, lequel est compilé en quelques secondes. Mais c'est ensuite que je dois attendre une bonne minute que l'éditeur de liens reconstruise l'ensemble du binaire. Si la mémoire libre est rare, je perds mon cache disque, et chaque fichier objet doit être relu du disque. Autant dire, je peux aller me faire un thé, cueillette et macération incluses.

J'ai donc essayé tout ce que j'ai pu, mais malheureusement, je n'ai pas réussi à faire fonctionner le mode incrémental pour la création de bibliothèques dynamiques, alors que cela semble se passer plutôt bien lorsque l'on s'occupe directement des exécutables. Pas de bol, la grande majorité du code de notre solution est incluse dans de grosses bibliothèques dynamiques, c'était donc cette phase qui était le principal goulot d'étranglement. Il va me falloir y passer un peu plus de temps pour comprendre ce qui se passe, je n'ai pas trouvé de documentation précise sur ce point.

À noter que Gold est également l'éditeur de liens permettant de faire de l'optimisation au "link time" (LTO). C'est une fonctionnalité relativement récente de g++, qui permet d'optimiser le programme globalement, plutôt que de considérer chaque unité de compilation de manière séparée. Cela repousse une grosse partie du temps de compilation dans l'éditeur de liens. Je compte bien m'intéresser très bientôt à la LTO, attendez-vous à bientôt en avoir des nouvelles ici.

Gold est multitheadé. La version que j'ai pu tester n'avait malheureusement pas été compilée avec cette fonctionnalité, je n'ai donc pas pu vérifier si cela changeait grand chose. En particulier, j'ai cru comprendre que c'était surtout utile pour la LTO.

Hormis quelques cas particuliers où Gold ne fonctionne pas (comme par exemple les modules du noyau Linux), il n'y a pas vraiment de raisons pour ne pas y passer. Gold est devenu un projet officiel GNU, et continuera vraisemblablement à s'améliorer, là où ld a stagné pendant si longtemps.

Aucun commentaire: