web-dev-qa-db-fra.com

Accélérez le temps de compilation avec SSD

Je veux essayer d'accélérer le temps de compilation de nos projets C++. Ils ont environ 3M lignes de code.

Bien sûr, je n'ai pas toujours besoin de compiler chaque projet, mais il y a parfois beaucoup de fichiers sources modifiés par d'autres, et je dois tous les recompiler (par exemple, lorsque quelqu'un met à jour un ASN.1 source fichier).

J'ai constaté que la compilation d'un projet à mi-parcours (qui ne concerne pas tous les fichiers source) prend environ trois minutes. Je sais que ce n’est pas trop, mais parfois c’est vraiment ennuyeux d’attendre une compilation ..

J'ai essayé de déplacer le code source vers un SSD (un vieil OCZ Vertex 3 60 Go) qui, comparé aux performances, est 5 à 60 fois plus rapide que le disque dur (en particulier en lecture/écriture aléatoire). Quoi qu'il en soit, le temps de compilation est presque identique (peut-être 2-3 secondes plus vite, mais ça devrait être une chance).

Peut-être que déplacer le bin Visual Studio vers un disque SSD donnerait une augmentation supplémentaire des performances?

Pour compléter la question: j'ai un W3520 Xeon @ 2,67 GHz et 12 Go de DDR3 ECC.

20
Jamby

La compilation/la liaison C++ est limitée par la vitesse de traitement et non par les E/S HDD. C'est pourquoi vous ne constatez aucune augmentation de la vitesse de compilation. (Déplacer les fichiers binaires du compilateur/de l’éditeur de liens vers le SSD ne fera rien. Lorsque vous compilez un projet volumineux, le compilateur/de l’éditeur de liens et la bibliothèque nécessaire sont lus une fois en mémoire et y restent.)

J'ai vu quelques accélérations mineures du déplacement du répertoire de travail vers un SSD ou un disque mémoire lors de la compilation de projets C (ce qui prend beaucoup moins de temps que les projets C++ qui utilisent beaucoup de modèles, etc.), mais pas suffisamment pour en valoir la peine.

9
us2012

Tout cela dépend énormément de votre environnement de construction et de toute autre configuration. Par exemple, sur mon serveur de compilation principal, j'ai 96 Go de RAM et 16 cœurs. Le disque dur est plutôt lent, mais cela n’a aucune importance, car tout est mis en cache dans la RAM.

Sur mon bureau (où je compile aussi parfois), je n'ai que 8 gib de RAM et six cœurs. Faire la même construction parallèle là-bas pourrait être grandement accéléré, car six compilateurs fonctionnant en parallèle consomment assez de mémoire pour que la différence de vitesse SSD soit très perceptible.

Il y a beaucoup de choses qui influencent les temps de compilation, y compris le ratio "CPU" de la CPU. D'après mon expérience ( GCC sur Linux), ils incluent:

  • Complexité du code. Beaucoup de métatemplates lui font utiliser plus de temps processeur, plus de code de type C pourrait rendre les E/S des objets générés (plus) dominants
  • Paramètres du compilateur pour les fichiers temporaires, tels que -pipe pour GCC.
  • Optimisation utilisée. Habituellement, plus l'optimisation est importante, plus le travail du processeur domine.
  • Constructions parallèles. La compilation d'un seul fichier à la fois ne produira probablement jamais assez d'E/S pour que le disque dur le plus lent d'aujourd'hui atteigne une limite quelconque. Compiler avec huit cœurs (ou plus) à la fois pourrait cependant.
  • Système d'exploitation/système de fichiers utilisé. Il semble que par le passé, certains systèmes de fichiers aient gêné le motif d'accès de nombreux fichiers construits en parallèle, créant essentiellement un goulot d'étranglement d'E/S dans le code du système de fichiers plutôt que le matériel sous-jacent.
  • Disponible RAM pour la mise en mémoire tampon. Plus un système d'exploitation peut mettre en mémoire tampon vos E/S de manière agressive, moins la vitesse du disque dur est importante. C’est pourquoi parfois un make -j6 peut être plus lent qu’un make -j4 malgré le nombre suffisant de cœurs inactifs.

Pour résumer: cela dépend de suffisamment de choses pour faire du "oui, cela vous aidera" ou "non, cela ne vous aidera pas" à la spéculation pure, alors si vous avez la possibilité de l'essayer, faites-le. Mais ne passez pas trop de temps dessus, car chaque heure que vous essayez de réduire votre temps de compilation en deux, essayez d’estimer la fréquence à laquelle vous (ou vos collègues, le cas échéant) avez pu reconstruire le projet et son rapport avec le temps possible économisé.

26
PlasmaHH

J'ai constaté que la compilation d'un projet d'environ 1 million de lignes de C++ était environ deux fois plus rapide que lorsque le code était sur un disque SSD (système avec une mémoire vive à huit coeurs Core i7 , 12 Go). En fait, la meilleure performance possible a été obtenue avec un disque SSD pour le système et un second pour la source - ce n’est pas que la compilation a été beaucoup plus rapide, mais le système d’exploitation était beaucoup plus réactif pendant la phase de développement.

L'autre chose qui a fait une énorme différence était la possibilité de construire en parallèle. Notez qu'il faut activer deux options distinctes:

  • Menu OutilsOptionsProjets et solutions → Nombre maximal de projets en parallèle
  • Propriétés du projet → C++/GénéralCompilation multiprocesseur

La compilation multiprocesseur est incompatible avec quelques autres indicateurs (y compris une reconstruction minimale, je pense), alors vérifiez la fenêtre de sortie pour les avertissements. J'ai constaté qu'avec le jeu d'indicateurs de compilation MP, tous les cœurs atteignaient une charge de près de 100%. Vous pouvez donc au moins voir que le processeur est utilisé de manière agressive.

4
the_mandrill

Un point non mentionné est que lorsque vous utilisez ccache et une construction hautement parallèle, vous verrez les avantages de l’utilisation d’un SSD.

0
nocnokneo