Blog 4 min de lecture

L’importance des systèmes de build distribués en C++

Share this article
L’importance des systèmes de build distribués en C++

En tant que développeur C++, si vous avez déjà compilé un projet C# ou Java, vous avez peut-être été surpris de la rapidité du processus de build comparé au C++. Pour certains projets C++, un build ne prend que quelques minutes, tandis que pour d'autres il peut prendre plusieurs heures, selon la taille du projet. Même lorsque la phase de compilation est parallélisée sur tous les cœurs disponibles, les builds C++ peuvent rester bien plus longs que ceux d'autres langages. Voici quelques-unes des raisons, comme l'explique cette utile réponse sur Stack Overflow:

  • Les fichiers d'en-tête : Chaque unité de compilation nécessite le chargement (1) puis la compilation (2) de centaines, voire de milliers d'en-têtes. Chacun d'eux doit généralement être recompilé pour chaque unité de compilation, car le préprocesseur fait que le résultat de la compilation d'un en-tête peut varier d'une unité de compilation à l'autre. (Une macro peut être définie dans une unité de compilation et modifier le contenu de l'en-tête.) C'est probablement la raison principale, car elle exige la compilation d'énormes quantités de code pour chaque unité de compilation, et de plus, chaque en-tête doit être compilé plusieurs fois (une fois pour chaque unité de compilation qui l'inclut).
  • L'édition de liens : Une fois compilés, tous les fichiers objets doivent être liés entre eux. Il s'agit d'un processus fondamentalement monolithique, difficilement parallélisable, qui doit traiter l'ensemble de votre projet.
  • L'analyse syntaxique : La syntaxe est extrêmement compliquée à analyser, dépend fortement du contexte et est très difficile à désambiguïser. Cela prend beaucoup de temps.
  • Les templates : En C#, List<T> est le seul type compilé, peu importe le nombre d'instanciations de List dans votre programme. En C++, vector<int> est un type complètement distinct de vector<float>, et chacun devra être compilé séparément.

Que se passe-t-il si le processus de build est lent ?

Si un build prend 10 minutes, l'entreprise perd l'équivalent de 10 minutes multiplié par le nombre de builds effectués chaque jour. Le coût total dépend aussi du nombre de développeurs. Plus il y a de développeurs, plus il y a de builds, et plus la perte de productivité s'aggrave.

Le calculateur de ROI d'IncrediBuild fournit une estimation du temps perdu lorsqu'une équipe compte X développeurs et que chaque build prend Y minutes. Cependant, ce calculateur est optimiste car il ne peut pas compter le coût caché. Par exemple, si un développeur lance un build et doit attendre 10 minutes, il peut passer à une autre activité, comme naviguer sur le web, et se laisser distraire. Résultat, une interruption de 10 minutes peut facilement se transformer en 15 ou 20 minutes.

Un build rapide aide les développeurs à rester concentrés sur le code sur lequel ils travaillent.

Comment optimiser le processus de build des projets C++ ? Plusieurs techniques peuvent aider à optimiser le processus de build ; certaines sont listées ici

  • L'idiome Pimpl
  • Les déclarations anticipées
  • Les gardes d'inclusion
  • Réduire l'interdépendance
  • Et, bien sûr, l'une des techniques les plus utilisées : les en-têtes précompilés.

Cependant, l'utilisation des techniques ci-dessus présente quelques inconvénients :

  • Il est difficile de s'assurer que ces solutions sont réellement appliquées ; une revue de code régulière est nécessaire.
  • Même lorsque ces solutions sont correctement appliquées, le gain de temps peut être limité, et les builds peuvent toujours prendre plusieurs heures pour les très gros projets.
  • Modifier le code uniquement pour résoudre des problèmes de temps de build est généralement une mauvaise idée ; le code devrait être conçu et implémenté indépendamment du processus de build utilisé.

Les systèmes de build distribués C++ à la rescousse

Un système de build distribué est un programme qui répartit la compilation du code sur plusieurs machines d'un réseau. Il doit toujours générer les mêmes résultats qu'une compilation locale.

Plusieurs systèmes de build distribués C++ intéressants sont disponibles. Personnellement, je n'ai utilisé que IncrediBuild.

IncrediBuild est une suite logicielle de grid computing développée par IncrediBuild Ltd. IncrediBuild est conçu pour aider à accélérer les tâches gourmandes en calcul en les distribuant sur le réseau, avec des applications notables comme la compilation de code source, le build logiciel en général, et d'autres tâches liées au développement logiciel. Les travaux peuvent être distribués sur plusieurs ordinateurs d'un réseau, offrant la possibilité d'accélérer le travail en utilisant plus de ressources que celles disponibles sur le seul ordinateur initiateur.

IncrediBuild nous a aidés à réduire considérablement les temps de build et à consacrer plus de temps aux tâches productives.

Si votre processus de build C++ prend trop de temps, envisagez d'utiliser un système de build distribué. Explorez les outils disponibles et choisissez celui qui répond le mieux à vos besoins.

Share this article