Comment faire pour que Windows aille aussi vite que Linux pour compiler C++?

je sais que ce n'est pas tellement une question de programmation, mais c'est pertinent.

je travaille sur un assez grande croix de projet de plate-forme . Sous Windows, J'utilise VC++ 2008. Sous Linux, j'utilise gcc. Il y a environ 40k fichiers dans le projet. Windows est 10x à 40x plus lent que Linux à compiler et à relier le même projet. Comment je peux arranger ça?

un simple changement incrémental construire 20 secondes sur Linux et > 3 minutes sur Windows. Pourquoi? Je peux même installer le linker "gold" sous Linux et ramener ce temps à 7 secondes.

de même git est 10x à 40x plus rapide sous Linux que sous Windows.

dans le cas de Git, il est possible que Git n'utilise pas Windows de la manière optimale mais VC++? On pourrait penser que Microsoft voudrait rendre ses propres développeurs aussi productifs que possible et une compilation plus rapide irait un long chemin vers cela. Peut-être qu'ils essaient d'encourager les développeurs en C#?

comme test simple, Trouver un dossier avec beaucoup de sous-dossiers et faire un simple

dir /s > c:list.txt

sur Windows. Faites-le deux fois pour qu'il sorte de la cache. Copiez les fichiers sous Linux et exécutez les 2 cycles équivalents et chronométrez le second cycle.

ls -R > /tmp/list.txt

j'ai 2 postes de travail avec exactement les mêmes caractéristiques. HP Z600s avec 12gig de ram, 8 cœurs à 3.0 ghz. Sur un dossier avec des fichiers ~400k, Windows prend 40secondes, Linux prend moins d'une seconde.

est-ce qu'il y a un paramètre de Registre que je peux configurer pour accélérer le développement de Windows? Ce qui donne?


quelques liens légèrement pertinents, pertinents pour compiler les temps, pas nécessairement e/s.

132
demandé sur gman 2011-08-02 21:27:38

13 réponses

à moins qu'un pirate de systèmes Windows hardcore n'arrive, vous n'obtiendrez pas plus que des commentaires partisans (ce que je ne ferai pas) et des spéculations (ce que je vais essayer).

  1. système de fichiers - vous devez essayer les mêmes opérations (y compris le dir ) sur le même système de fichiers. Je suis tombé sur ce qui repère quelques systèmes de fichiers pour différents paramètres.

  2. "151910920 la mise en Cache". Une fois, j'ai essayé D'exécuter une compilation sur Linux sur un disque RAM et j'ai trouvé qu'elle était plus lente que sur le disque grâce à la façon dont le noyau s'occupe de la mise en cache. C'est un bon argument de vente Pour Linux et c'est peut-être la raison pour laquelle les performances sont si différentes.

  3. Mauvais dépendance spécifications sur Windows. Peut-être que les spécifications de la dépendance au chrome pour Windows ne sont pas aussi correctes que pour Linux. Il pourrait en résulter compilations inutiles lorsque vous faites un petit changement. Vous pourriez être en mesure de valider cela en utilisant la même chaîne d'outils du compilateur sur Windows.

32
répondu Noufal Ibrahim 2011-12-20 05:49:14

quelques idées:

  1. désactiver 8.3 noms. Cela peut être un grand facteur sur les lecteurs avec un grand nombre de fichiers et un relativement petit nombre de dossiers: fsutil behavior set disable8dot3 1
  2. utilisez plus de dossiers. Selon mon expérience, NTFS commence à ralentir avec plus de 1000 fichiers par dossier.
  3. active les constructions parallèles avec MSBuild; il suffit d'ajouter le commutateur "/m", et il démarre automatiquement une copie de MSBuild par noyau CPU.
  4. mettez vos fichiers sur un SSD -- aide énormément pour les entrées/sorties aléatoires
  5. si votre taille moyenne de fichier est beaucoup plus grande que 4KB, envisager de reconstruire le système de fichiers avec une plus grande taille de grappe qui correspond à peu près à votre taille moyenne de fichier.
  6. assurez-vous que les fichiers ont été défragmenté. Fichiers fragmentés causer beaucoup de recherches disque, qui peut vous coûter un facteur de 40+ débit. Utilisez l'utilitaire "contig" de sysinternals, ou l'utilitaire intégré Le défragmenteur de Windows.
  7. si votre taille moyenne de fichier est petite, et que la partition que vous utilisez est relativement pleine, il est possible que vous utilisiez un MFT fragmenté, ce qui est mauvais pour les performances. De plus, les fichiers inférieurs à 1K sont stockés directement dans le MFT. L'utilitaire "contig" mentionné ci-dessus peut vous aider, ou vous pourriez avoir besoin d'augmenter la taille de MFT. La commande suivante le doublera, à 25% du volume: fsutil behavior set mftzone 2 changer le dernier nombre à 3 ou 4 pour augmenter la taille par incréments supplémentaires de 12,5%. Après avoir lancé la commande, redémarrez et créez le système de fichiers.
  8. Désactiver la date de dernier accès le temps: fsutil behavior set disablelastaccess 1
  9. désactiver le service d'indexation
  10. désactivez votre logiciel anti-virus et anti-logiciel espion, ou au moins mettez les dossiers pertinents à ignorer.
  11. mettez vos fichiers sur un disque physique différent du système D'exploitation et du fichier de pagination. L'utilisation d'un lecteur physique séparé permet Windows utiliser des I/Os parallèles aux deux disques.
  12. regardez vos options de compilateur. Le compilateur Windows C++ a une tonne d'options; assurez-vous que vous n'utilisez que celles dont vous avez vraiment besoin.
  13. essayez d'augmenter la quantité de mémoire que L'OS utilise pour les tampons de piscine pagée (assurez-vous que vous avez assez de RAM en premier): fsutil behavior set memoryusage 2
  14. vérifiez le journal des erreurs Windows pour être sûr que vous n'avez pas d'erreurs de disque occasionnelles.
  15. ont un regardez les compteurs de performances physiques liés au disque pour voir combien vos disques sont occupés. Les longues files d'attente ou les longs délais par transfert sont de mauvais signes.
  16. le premier 30% des partitions de disque est beaucoup plus rapide que le reste du disque en termes de temps de transfert brut. Des cloisons plus étroites aident aussi à réduire les temps de recherche.
  17. utilisez-vous RAID? Si c'est le cas, vous devrez peut-être optimiser votre choix du type de RAID (RAID-5 est mauvais pour les opérations en écriture comme la compilation)
  18. désactiver tous les services dont vous n'avez pas besoin
  19. dossiers Defragment: copiez tous les fichiers sur un autre lecteur (juste les fichiers), supprimez les fichiers originaux, copiez tous les dossiers sur un autre lecteur (juste les dossiers vides), puis supprimez les dossiers originaux, défragmentez le lecteur original, copiez la structure du dossier en arrière d'abord, puis copiez les fichiers. Lorsque Windows construit de grands dossiers un fichier à la fois, les dossiers finissent par être fragmentés et lents. ("contig" devrait aider ici, aussi)
  20. si vous êtes lié par une entrée/sortie et que vous avez des cycles CPU à éviter, essayez de tourner la compression du disque. Il peut fournir quelques vitesses significatives pour les fichiers hautement compressibles (comme le code source), avec un certain coût en CPU.
24
répondu RickNZ 2011-12-26 14:42:55

NTFS sauve le temps d'accès au fichier à chaque fois. Vous pouvez essayer de le désactiver: "fsutil behavior set disablelastaccess 1" (redémarrage)

23
répondu Agent_L 2011-12-20 15:18:00

le problème avec visual C++ est, pour autant que je sache, que ce n'est pas une priorité pour l'équipe de compilation d'optimiser ce scénario. Leur solution est que vous utilisez leur fonction d'en-tête précompilé. C'est ce que windows des projets spécifiques ont fait. Il n'est pas portable, mais il fonctionne.

en outre, sur windows, vous avez typiquement des scanners de virus, ainsi que la restauration du système et des outils de recherche qui peuvent ruiner vos temps de construction complètement s'ils surveillent votre dossier buid pour vous. windows 7 moniteur de ressource peut vous aider à repérer. J'ai une réponse ici avec quelques conseils supplémentaires pour optimiser les temps de construction vc++ si vous êtes vraiment intéressé.

19
répondu Community 2017-05-23 11:47:24

j'ai personnellement trouvé que l'exécution d'une machine virtuelle windows sur linux a réussi à supprimer une grande partie de la lenteur IO dans windows, probablement parce que la VM linux faisait beaucoup de cache que Windows lui-même n'était pas.

en faisant cela j'ai pu accélérer les temps de compilation d'un grand (250Kloc) projet C++ sur lequel je travaillais de quelque chose comme 15 minutes à environ 6 minutes.

16
répondu bfrog 2011-12-19 14:45:31

la difficulté à faire cela est due au fait que C++ a tendance à s'étendre et à étendre le processus de compilation sur de nombreux petits fichiers individuels. C'est quelque chose où Linux est bon et Windows ne l'est pas. Si vous voulez faire un compilateur C++ vraiment rapide Pour Windows, essayez de garder tout en RAM et de toucher le système de fichiers aussi peu que possible.

c'est aussi comme ça que vous allez faire une chaîne de compilation Linux C++ plus rapide, mais C'est moins important sous Linux parce que le système de fichiers fait déjà beaucoup de ce réglage pour vous.

la raison en est due à la culture Unix: Historiquement, la performance du système de fichiers a été une priorité beaucoup plus élevée dans le monde Unix que dans Windows. Cela ne veut pas dire qu'il n'a pas été une priorité dans Windows, juste que dans Unix il a été une priorité plus élevée.

  1. accès au code source.

    Vous ne pouvez pas changer ce que vous ne pouvez pas contrôler. Le manque d'accès à Windows Le code source NTFS signifie que la plupart des efforts pour améliorer la performance ont été des améliorations matérielles. Autrement dit, si la performance est lente, vous contournez le problème en améliorant le matériel: le bus, le support de stockage, etc. Vous ne pouvez faire tellement si vous devez travailler autour du problème, pas le résoudre.

    L'accès au code source Unix (même avant open source) était plus répandu. Par conséquent, si vous souhaitez améliorer les performances vous adresse en premier logiciel (moins cher et plus facile) et le deuxième matériel.

    en conséquence, il ya beaucoup de gens dans le monde qui ont obtenu leur doctorat en étudiant le système de fichiers Unix et de trouver de nouvelles façons d'améliorer les performances.

  2. Unix tend vers de nombreux petits fichiers; Windows tend vers quelques (ou un seul) gros fichiers.

    les applications Unix ont tendance à traiter de nombreux petits fichiers. Pensez à un environnement de développement de logiciels: beaucoup de petites des fichiers sources, chacun avec son propre but. L'étape finale (lien) crée un gros fichier, mais c'est un petit pourcentage.

    en conséquence, Unix a des appels système hautement optimisés pour l'ouverture et la fermeture des fichiers, la numérisation des répertoires, et ainsi de suite. L'histoire D'Unix research papers s'étend sur des décennies d'optimisation des systèmes de fichiers qui ont mis beaucoup de réflexion sur l'amélioration de l'accès aux répertoires (recherches et analyses complètes des répertoires), l'ouverture initiale des fichiers, et ainsi de suite.

    les applications Windows ont tendance à ouvrir un grand fichier, le maintenir ouvert pendant une longue période, le fermer lorsqu'il est terminé. Pensez à MS-Word. msword.exe (ou n'importe quoi d'autre) ouvre le fichier une fois et ajoute pendant des heures, met à jour les blocs internes, et ainsi de suite. L'optimisation de l'ouverture du fichier serait une perte de temps.

    L'histoire de Windows benchmarking et l'optimisation a été sur la vitesse à laquelle on peut lire ou écrire de longs fichiers. C'est ce qui est optimisée.

    Malheureusement, le développement de logiciels tend vers la première situation. Heck, le meilleur système de traitement de texte pour Unix (TeX/LaTeX) vous encourage à mettre chaque chapitre dans un fichier différent et #les inclure tous ensemble.

  3. Unix est axé sur la haute performance; Windows est axé sur l'expérience utilisateur

    Unix démarré dans la salle des serveurs: pas d'interface utilisateur. Les utilisateurs ne voient que la vitesse. Par conséquent, la vitesse est une priorité.

    Windows a commencé sur le bureau: les utilisateurs se soucient seulement de ce qu'ils voient, et ils voient L'interface utilisateur. Par conséquent, plus d'énergie est consacrée à l'amélioration de L'UI que la performance.

  4. L'écosystème Windows dépend de l'obsolescence planifiée. Pourquoi optimiser un logiciel alors que le nouveau matériel n'est qu'à un an ou deux?

    Je ne crois pas aux théories du complot mais si je le faisais, je ferais remarquer que dans la culture Windows là sont moins d'incitations à améliorer les performances. Windows business models dépend des gens qui achètent de nouvelles machines comme clockwork. (C'est pourquoi le cours des actions de milliers d'entreprises est affecté si MS envoie un système d'exploitation en retard ou si Intel manque une date de sortie de puce.). Cela signifie qu'il y a une incitation à résoudre les problèmes de performance en disant aux gens d'acheter du nouveau matériel; pas en améliorant le vrai problème: les systèmes d'exploitation lents. Unix vient du milieu universitaire où le budget est serré et vous peut obtenir votre doctorat en inventant une nouvelle façon de rendre les systèmes de fichiers plus rapides; rarement quelqu'un dans le milieu universitaire obtient des points pour résoudre un problème en émettant un bon de commande. Dans Windows il n'y a pas de conspiration pour maintenir le logiciel lent, mais l'écosystème entier dépend de l'obsolescence planifiée.

    aussi, comme Unix est open source (même si ce n'était pas le cas, tout le monde avait accès à la source) tout doctorant ennuyé peut lire le code et devenir célèbre en le rendant meilleur. Cela ne se produit pas dans Windows (MS a un programme qui permet aux universitaires d'accéder au code source de Windows, il est rarement utilisé). Regardez cette sélection de Unix de performance liés à communications: http://www.eecs.harvard.edu/margo/papers/ ou de rechercher l'histoire de papiers par Osterhaus, Henry Spencer, ou autres. Heck, l'un des plus grands (et des plus agréables à regarder) débats dans L'histoire D'Unix a été le va-et-vient entre Osterhaus et Selzer http://www.eecs.harvard.edu/margo/papers/usenix95-lfs/supplement/rebuttal.html On ne voit pas ce genre de chose dans le monde des fenêtres. Vous pourriez voir les vendeurs un-uping l'autre, mais cela semble être beaucoup plus rare ces derniers temps puisque l'innovation semble être tous au niveau de l'organisme de normes.

C'est comme ça que je le vois.

mise à jour: si vous regardez les nouvelles chaînes de compilateurs qui sont en sortant de Microsoft, vous serez très optimiste parce qu'une grande partie de ce qu'ils font rend plus facile de garder l'ensemble de la chaîne D'outils en RAM et de répéter moins de travail. Très impressionnant de choses.

13
répondu TomOnTime 2015-04-25 16:44:25

liaison incrémentielle

si la solution VC 2008 est configurée comme plusieurs projets avec .lib outputs, vous devez définir "Use Library Dependency Inputs"; cela rend le lien linker directement contre le .fichiers obj plutôt que le .lib. (Et fait en fait un lien incrémental.)

Directory traversal performance

c'est un peu injuste de comparer les répertoires rampant sur la machine originale avec rampant sur une nouvelle création répertoire avec les mêmes fichiers sur une autre machine. Si vous voulez un test équivalent, vous devriez probablement faire une autre copie du répertoire sur la machine source. (Il peut toujours être lente, mais cela pourrait être dû à un certain nombre de choses: la fragmentation du disque, les noms de fichiers courts, services d'arrière-plan, etc.) Bien que je pense que les problèmes de perf pour dir /s ont plus à voir avec l'écriture de la sortie que la mesure réelle de la performance transversale de fichier. Même dir /s /b > nul est lent sur ma machine avec un énorme répertoire.

7
répondu MSN 2011-12-19 18:25:28

je suis presque sûr que c'est lié au système de fichiers. Je travaille sur un projet multi-plateforme pour Linux et Windows où tout le code est commun, sauf là où le code dépendant de la plateforme est absolument nécessaire. Nous utilisons Mercurial, pas git, de sorte que le "Linuxness" de git ne s'applique pas. Tirer les modifications du dépôt central prend une éternité sur Windows par rapport à Linux, mais je dois dire que nos machines Windows 7 font beaucoup mieux que celles Windows XP. Compiler le code après cela est encore pire sur VS 2008. Il n'est pas seulement hg; CMake exécute beaucoup plus lent sur Windows ainsi, et ces deux outils utilisent le système de fichiers plus que tout autre chose.

le problème est si grave que la plupart de nos développeurs qui travaillent dans un environnement Windows ne prennent même plus la peine de faire des constructions incrémentielles - ils trouvent que faire une construction d'unité à la place est plus rapide.

soit dit en passant, si vous voulez augmenter considérablement la vitesse de compilation en Windows, je suggère la construction de l'unité mentionnée ci-dessus. C'est difficile à mettre en œuvre correctement dans le système de construction (je l'ai fait pour notre équipe à CMake), mais une fois fait automagically accélère les choses pour nos serveurs d'intégration continue. Selon le nombre de binaires que votre système de compilation crache, vous pouvez obtenir une amélioration de 1 à 2 ordres de grandeur. Votre kilométrage peut varier. Dans notre cas, je pense qu'il accélère les versions Linux triple et celui de Windows par un facteur d'environ 10, mais nous avons beaucoup de partagé bibliothèques et exécutables (ce qui diminue les avantages d'une construction unitaire).

6
répondu Átila Neves 2017-05-23 12:34:29

comment construisez-vous votre projet de plateforme transversale? Si vous utilisez des makefiles courants pour Linux et Windows, vous pourriez facilement dégrader les performances de windows par un facteur de 10 si les makefiles ne sont pas conçus pour être rapides sur Windows.

je viens de fixer quelques makefiles d'un projet multi-plateforme utilisant des makefiles communs (GNU) Pour Linux et Windows. Make lance un processus sh.exe pour chaque ligne d'une recette provoquant la différence de performance entre Windows et Linux!

selon la documentation GNU make

.ONESHELL:

devrait résoudre le problème, mais cette fonctionnalité n'est (actuellement) pas prise en charge pour Windows make. Ainsi, réécrire les recettes sur des lignes logiques simples (par exemple en ajoutant ;\ ou \ à la fin des lignes de l'éditeur actuel) a très bien fonctionné!

5
répondu V15I0N 2012-03-02 10:45:18

IMHO tout cela est au sujet de la performance d'E/S de disque. L'ordre de grandeur suggère que beaucoup d'opérations vont sur disque sous Windows alors qu'elles sont gérées en mémoire sous Linux, C'est-à-dire que Linux cache mieux. Votre meilleure option sous windows sera de déplacer vos fichiers sur un disque rapide, serveur ou système de fichiers. Envisagez d'acheter un disque dur à L'état solide ou de déplacer vos fichiers vers un ramdisk ou un serveur NFS rapide.

j'ai lancé les tests de traversée de répertoire et les résultats sont très proche des temps de compilation rapportés, ce qui suggère que cela n'a rien à voir avec les temps de traitement CPU ou les algorithmes de compilateur/linker.

des temps Mesurés comme suggéré ci-dessus traversant le chrome arborescence de répertoire:

  • Windows Home Premium 7 (8 Go Ram) sur NTFS: 32 secondes
  • Ubuntu 11.04 Linux (2 Go Ram) on NTFS: 10 Secondes
  • Ubuntu 11.04 Linux (2 Go Ram) on ext4: 0.6 seconds

pour les tests j'ai tiré les sources de chrome (tous les deux sous win / linux)

git clone http://github.com/chromium/chromium.git 
cd chromium
git checkout remotes/origin/trunk 

Pour mesurer le temps, j'ai couru

ls -lR > ../list.txt ; time ls -lR > ../list.txt # bash
dir -Recurse > ../list.txt ; (measure-command { dir -Recurse > ../list.txt }).TotalSeconds  #Powershell

j'ai désactivé les horodateurs d'accès, mon scanner de virus et augmenté les paramètres du gestionnaire de cache sous windows (>2 Go de RAM) - le tout sans aucune amélioration notable. Le fait est, hors de la boîte Linux exécuté 50x mieux que Windows avec un quart de la RAM.

pour quiconque veut soutenir que les chiffres faux - pour quelque raison que ce soit - s'il vous plaît lui donner un essai et poster vos conclusions.

4
répondu b7kich 2011-12-22 20:44:57

"essayez d'utiliser jom au lieu de nmake

: http://qt.gitorious.org/qt-labs/jom

le fait est que nmake n'utilise qu'un de vos noyaux, jom est un clone de nmake qui utilise des processeurs multicore.

GNU faire que out-of-the-box grâce à l'option-j, qui pourrait être un, en raison de sa vitesse vs Microsoft nmake.

jom fonctionne en exécutant en parallèle différentes commandes sur différents processeurs/cœurs. Essayez de sentir la différence!

2
répondu OpenNingia 2011-12-20 14:59:06

je veux ajouter juste une observation en utilisant Gnu make et d'autres outils de MinGW tools sur Windows: ils semblent résoudre les noms d'hôtes même lorsque les outils ne peuvent même pas communiquer via IP. Je suppose que cela est dû à une certaine routine d'initialisation de L'exécution MinGW. L'exécution d'un proxy local DNS m'a aidé à améliorer la vitesse de compilation avec ces outils.

avant que j'ai eu un gros mal de tête parce que la vitesse de construction a chuté d'un facteur de 10 environ quand j'ai ouvert un VPN connexion en parallèle. Dans ce cas, toutes ces recherches DNS sont passées par le VPN.

cette observation pourrait également s'appliquer à d'autres outils de construction, non seulement basé sur MinGW et il aurait pu changer sur la dernière version MinGW entretemps.

1
répondu V15I0N 2016-06-09 07:27:58

je pourrais récemment archiver une autre façon d'accélérer la compilation d'environ 10% sur Windows en utilisant Gnu make en remplaçant la mingw bash.exe avec la version de gagnant-bash

(La victoire-bash n'est pas très à l'aise quant à l'édition interactive.)

0
répondu V15I0N 2018-08-13 20:13:18