J'utilise Visual Studio, et il semble que vous éliminiez les références inutilisées et utiliser des déclarations accélère mon temps de construction sur des projets plus importants. Y a-t-il d'autres moyens connus d'accélérer le temps de construction. Qu'en est-il des autres langues et de créer des environnements? P>
Qu'est-ce qui est typiquement le goulot d'étranglement pendant la construction / compiler? Disque, cpu, mémoire? P>
Qu'est-ce qu'une liste de / sont de bonnes références pour les constructions distribuées? p>
12 Réponses :
Fixation de vos avertissements du compilateur devrait aider un peu. P>
Seulement s'il utilise l'outil de ligne de commande "CL". L'écriture de stdout dans un fichier n'est pas lent - même sur Windows.
Je suis juste curieux si cela est simplement dû à les écrire à un logfile qui cause le ralentissement, donc si vous avez peu d'avertissements, ou il n'y a pas de goulot d'étranglement, cela ne comportera pas vraiment?
tout lien pour remonter ça? Notre programme génère plus de 5000 avertissements de compilateur et je suis à la recherche d'une bonne excuse pour remédier à cela depuis un certain temps
Ouais, je suis assez curieux de savoir celui-là, une référence a-t-elle été faite sur ce point?
@Chrisshouts Comment cela se passe-t-il même? Je ne sais pas si vous travaillez toujours là, mais savez-vous si cela a été corrigé?
@Aidanmueller Je ne travaille plus là, mais au mieux de mes connaissances, il n'a pas été corrigé. Il m'a cicatrisé pour la vie; J'allume "Traitement des avertissements comme erreurs" dans chaque nouveau projet que je crée.
Visual Studio prend en charge des constructions parallèles, ce qui peut aider, mais le véritable goulot d'étranglement est le disque IO. P>
in c Par exemple - Si vous générez des fichiers CLST, votre compilation prendra des âges. P>
Un fichier de liste. C'est une sortie d'instructions de montage pour le code source donné. Plusieurs fois, il inclut également le texte de code source en ligne avec l'assembly afin que vous puissiez voir quelles instructions sont associées à quelles lignes de code source.
Ne compilez pas avec le débogage activé. P>
C'est une mauvaise suggestion. Les constructions de débogage sont souvent nécessaires. En fait, la plupart de vos constructions finiront probablement d'être des constructions de débogage car c'est le mode que vous utilisez le plus probablement comme vous développez.
Je n'ai pas dit qu'il n'est pas utile de compiler avec W / Débogu activé. La question a demandé comment améliorer l'heure de compilation uniquement.
Veuillez lire ce livre. C'est plutôt bien sur le sujet de la structure physique de votre projet dans différents fichiers avec des reconstructions minimales. P>
Illicité, il a été écrit avant que les modèles ne soient importants. Les modèles sont le tueur en temps réel en matière de compilation C ++. Especialls Si vous faites l'erreur et utilisez des pointeurs intelligents partout. Dans ce cas, vous ne pouvez effectuer que constamment de mettre à niveau vers la dernière CPU et les derniers disques SSD. MSVC est déjà le compilateur C ++ existant le plus rapide si vous utilisez des en-têtes précompilés. p>
Ce n'est pas toujours le cas. J'ai un projet au travail que je viens de passer à partir de processeurs de 2,83 GHz à 3,2 GHz, à la fois quad noyau. Je double la quantité de mémoire de 8 Go à 16 Go. Je suis passé de RAID0 7200RPM à RAID0 15K SAS, et je ne vois toujours pas d'amélioration du temps de construction. Il semble y avoir d'autres facteurs à prendre en compte.
Cela ne fera qu'aider un peu. Distribution (voir ma réponse) vous donnera beaucoup plus de cycles. Nous sommes allés de 3 GHz à environ 900 GHz lorsque vous allez distribuer. :) Cordialement, Sebastiaan
Je suppose que la mise à niveau de 1 noyau à 8 noyau améliorerait la performance beaucoup - peut-être que le disque d'E / S serait le goulot d'étranglement dans ce cas.
À mon emploi précédent, nous avons eu de gros problèmes avec le temps de compilation et l'une des stratégies que nous avons utilisées a été appelée le modèle d'enveloppe voir ici .
Il tente essentiellement de minimiser la quantité de code copiée dans les en-têtes par le pré-processeur en minimisant la taille de l'en-tête. Cela a fait cela en déplaçant tout ce qui n'était pas public à une classe d'amis privée, voici un exemple. P>
foo.h: p> foo.cpp : P> Foo::Foo()
{
foo = new FooPrivate();
}
class FooPrivate
{
int privData;
char *morePrivData;
};
Si vous n'êtes pas satisfait de ce que cette solution a fait à votre cycle de maintenance, alors pourquoi le suggère du tout?
Comme un avertissement. Je le suggère afin que les gens sachent que cela existe et l'évite à tout prix. Cela fonctionne, il réduit le temps de compilation, mais comme je l'ai dit, le débogage est presque impossible sur VC6.
La plus grande amélioration que nous avons faite pour notre vaste projet C ++ était de distribuer nos constructions. Il y a quelques années, une construction complète prendrait environ une demi-heure, tandis que c'est maintenant environ trois minutes, dont un tiers est le temps de liaison. p>
Nous utilisons un système de construction exclusif, mais incrédibuild fonctionne bien pour beaucoup de personnes (nous ne pouvions pas l'obtenir de travailler de manière fiable). P>
Je veux poser une question Quelle est la différence entre compile code> et
construction code>
Si vous utilisez beaucoup de fichiers et beaucoup de code modèles (STL / Boost / etc.), la construction en vrac ou à l'unité doit réduire les temps de construction et de liaison. P>
L'idée de Bulk construit pour casser votre projet dans les sous-sections et inclure tous les fichiers du CPP de cette sous-section dans un seul fichier. Unity Builds Sortez plus loin en ayant un seul fichier CPP compilé qui intégre tous les autres fichiers du CPP. P>
La raison en est souvent plus rapide est la suivante: p>
1) Les modèles ne sont évalués qu'une fois par fichier en vrac p>
2) Inclure les fichiers sont ouverts / traités une seule fois par fichier en vrac (en supposant qu'il existe un fichier 3) La liaison a beaucoup moins de données pour fonctionner avec (fichier OBJ unique ou plusieurs fichiers OBJ en vrac) et est moins susceptible de la mémoire virtuelle. P>
edit strong> Ajout d'un Couple de liens ici sur le débordement de la pile sur les constructions de l'unité. p> #Ifndef__filename__h / #define fichier__filename__h / #endif code> wrapper dans le fichier Inclure). Réduire les E / S Total est une bonne chose pour les temps de compilation. P>
Méfiez-vous d'un large balayage "Considérez ce répertoire et tous les sous-répertoires pour l'inclusion d'en-tête" Type Paramètres de votre projet. Cela fera que le compilateur ait à itérer chaque répertoire jusqu'à ce que le fichier d'en-tête demandé soit trouvé et peut être une opération très coûteuse pour cependant de nombreux en-têtes que vous incluez dans votre projet. P>
Je suis d'accord qu'il est important, mais est-ce vraiment "très cher"?
Pour C ++, le goulot d'étranglement du maire est le disque I / O. Beaucoup d'en-têtes comprennent d'autres en-têtes d'avant en arrière, ce qui entraîne l'ouverture et la lecture de nombreux fichiers pour chaque unité de compilation.
Vous pouvez atteindre une amélioration significative si vous déplacez les sources dans un disque RAM. Encore plus si vous assurez que vos fichiers source se lisent exactement une fois. P>
Donc, pour de nouveaux projets, j'ai commencé à inclure tout dans un seul fichier que j'appelle et je compile que ce fichier unique. P> Mes en-têtes et fichiers source n'incluent rien et utilise des espaces de noms pour Évitez les affrontements avec d'autres modules. P> Chaque fois que mon programme manque quelque chose, j'ajoute une en-tête et une source dans ce module uniquement. p> Ainsi, chaque fichier source et en-tête est lu exactement une fois, et construit très vite. Les heures de compilation n'augmentent que linéairement lorsque vous ajoutez plus de fichiers, mais pas quadratique. Mon projet de passe-temps est d'environ 40000 LOC et 500 modules mais compile toujours environ 10-20 secondes. Si je déplace toutes les sources et toutes les en-têtes en un temps de compilation de disque RAM réduit à 3 secondes. Em> p> inconvénient de cela, que les codes existants sont assez difficiles à refracteur pour utiliser ce schéma. p> p> _. CPP code>. Sa structure est comme ceci: p>
pour C # - Utiliser des versions fixes pour vos assemblages au lieu de progressivement automatiquement accélère considérablement les constructions locales ultérieures.
assemblageinfo.cs p>
Temps de compilation et problème de la classe de base fragile: J'ai écrit un blog sur un moyen d'améliorer le temps de compilation en C ++. lien . P>
En réalité, ce n'est pas une langue-agnostique. Différentes langues ont des exigences différentes pour un compilateur, qui affecte considérablement le temps de compilation de manière significative,
Vrai, mais ma question est davantage de savoir comment améliorer les performances dans différents compilateurs, environnements, langues, etc. I généralement utiliser Visual Studio, mais parfois Msbuild, Perl, etc.