Ich weiß, dass dies nicht so sehr eine Programmierfrage ist, aber es ist relevant.
Ich arbeite an einem ziemlich großen plattformübergreifenden Projekt . Unter Windows verwende ich VC ++ 2008. Unter Linux verwende ich gcc. Das Projekt enthält ca. 40.000 Dateien. Windows ist beim Kompilieren und Verknüpfen desselben Projekts 10x bis 40x langsamer als Linux. Wie kann ich das beheben?
Eine einzelne Änderung inkrementell Build 20 Sekunden unter Linux und> 3 Minuten unter Windows. Warum? Ich kann sogar den 'Gold'-Linker unter Linux installieren und diese Zeit auf 7 Sekunden reduzieren.
Ebenso ist Git unter Linux 10x bis 40x schneller als unter Windows.
Im Git-Fall ist es möglich, dass Git Windows nicht optimal nutzt, sondern VC ++? Man könnte meinen, Microsoft möchte seine eigenen Entwickler so produktiv wie möglich machen, und eine schnellere Kompilierung würde einen großen Beitrag dazu leisten. Vielleicht versuchen sie, Entwickler zu C # zu ermutigen?
Suchen Sie als einfachen Test einen Ordner mit vielen Unterordnern und führen Sie einen einfachen aus
dir /s > c:\list.txt
unter Windows. Tun Sie es zweimal und legen Sie den zweiten Lauf fest, damit er aus dem Cache ausgeführt wird. Kopieren Sie die Dateien nach Linux und führen Sie die entsprechenden 2 Läufe und den zweiten Lauf aus.
ls -R > /tmp/list.txt
Ich habe 2 Workstations mit genau den gleichen Spezifikationen. HP Z600s mit 12 Gigabyte RAM, 8 Kerne bei 3,0 GHz. In einem Ordner mit ~ 400.000 Dateien dauert Windows 40 Sekunden, Linux <1 Sekunde.
Gibt es eine Registrierungseinstellung, die ich festlegen kann, um Windows zu beschleunigen? Was gibt?
Einige leicht relevante Links, die für die Kompilierungszeiten relevant sind, nicht unbedingt i / o.
Anscheinend gibt es in Windows 10 (nicht in Windows 7) ein Problem, dass das Schließen eines Prozesses eine globale Sperre enthält . Beim Kompilieren mit mehreren Kernen und damit mehreren Prozessen tritt dieses Problem auf.
Die
/analyse
Option kann die Leistung beeinträchtigen, da ein Webbrowser geladen wird . (Nicht relevant hier, aber gut zu wissen)
Antworten:
Wenn kein Hardcore-Hacker für Windows-Systeme hinzukommt, werden Sie nicht mehr als parteipolitische Kommentare (was ich nicht tun werde) und Spekulationen (was ich versuchen werde) erhalten.
Dateisystem - Sie sollten dieselben Vorgänge (einschließlich der
dir
) auf demselben Dateisystem ausführen . Ich kam in diese , die einige Dateisysteme für verschiedene Parameter Benchmarks.Caching. Ich habe einmal versucht, eine Kompilierung unter Linux auf einer RAM-Disk auszuführen, und festgestellt, dass sie langsamer ist als die Ausführung auf einer Festplatte, da der Kernel das Caching übernimmt. Dies ist ein solides Verkaufsargument für Linux und möglicherweise der Grund, warum die Leistung so unterschiedlich ist.
Schlechte Abhängigkeitsspezifikationen unter Windows. Möglicherweise sind die Chromabhängigkeitsspezifikationen für Windows nicht so korrekt wie für Linux. Dies kann zu unnötigen Kompilierungen führen, wenn Sie eine kleine Änderung vornehmen. Möglicherweise können Sie dies mit derselben Compiler-Toolchain unter Windows überprüfen.
quelle
Ein paar Ideen:
fsutil behavior set disable8dot3 1
fsutil behavior set mftzone 2
Ändern Sie die letzte Zahl auf 3 oder 4, um die Größe um zusätzliche 12,5% -Schritte zu erhöhen. Starten Sie nach dem Ausführen des Befehls neu und erstellen Sie das Dateisystem.fsutil behavior set disablelastaccess 1
fsutil behavior set memoryusage 2
quelle
NTFS spart jedes Mal Dateizugriffszeit. Sie können versuchen, es zu deaktivieren: "fsutil behaviour set disablelastaccess 1" (Neustart)
quelle
Das Problem mit Visual C ++ ist, soweit ich das beurteilen kann, dass es für das Compilerteam keine Priorität ist, dieses Szenario zu optimieren. Ihre Lösung besteht darin, dass Sie die vorkompilierte Header-Funktion verwenden. Dies haben Windows-spezifische Projekte getan. Es ist nicht tragbar, aber es funktioniert.
Darüber hinaus verfügen Sie unter Windows normalerweise über Virenscanner sowie Tools zur Systemwiederherstellung und -suche, die Ihre Erstellungszeiten vollständig beeinträchtigen können, wenn sie Ihren Buid-Ordner für Sie überwachen. Windows 7 Resouce Monitor kann Ihnen helfen, es zu erkennen. Ich habe hier eine Antwort mit einigen weiteren Tipps zur Optimierung der vc ++ - Erstellungszeiten, wenn Sie wirklich interessiert sind.
quelle
Ich persönlich habe festgestellt, dass das Ausführen einer virtuellen Windows-Maschine unter Linux es geschafft hat, einen Großteil der E / A-Langsamkeit in Windows zu beseitigen, wahrscheinlich weil die Linux-VM viel Caching durchführte, was Windows selbst nicht war.
Auf diese Weise konnte ich die Kompilierungszeiten eines großen (250Kloc) C ++ - Projekts, an dem ich arbeitete, von etwa 15 Minuten auf etwa 6 Minuten beschleunigen.
quelle
Die Schwierigkeit dabei ist auf die Tatsache zurückzuführen, dass C ++ dazu neigt, sich selbst und den Kompilierungsprozess auf viele kleine, individuelle Dateien zu verteilen. Das ist etwas, was Linux gut kann und Windows nicht. Wenn Sie einen wirklich schnellen C ++ - Compiler für Windows erstellen möchten, versuchen Sie, alles im RAM zu belassen und das Dateisystem so wenig wie möglich zu berühren.
Auf diese Weise können Sie auch eine schnellere Linux C ++ - Kompilierungskette erstellen. Unter Linux ist dies jedoch weniger wichtig, da das Dateisystem bereits einen Großteil dieser Optimierung für Sie vornimmt.
Der Grund dafür liegt in der Unix-Kultur: In der Vergangenheit hatte die Leistung von Dateisystemen in der Unix-Welt eine viel höhere Priorität als in Windows. Um nicht zu sagen, dass es unter Windows keine Priorität hatte, nur dass es unter Unix eine höhere Priorität hatte.
Zugriff auf den Quellcode.
Sie können nicht ändern, was Sie nicht kontrollieren können. Der fehlende Zugriff auf Windows NTFS-Quellcode bedeutet, dass die meisten Anstrengungen zur Verbesserung der Leistung durch Hardwareverbesserungen unternommen wurden. Wenn die Leistung langsam ist, können Sie das Problem umgehen, indem Sie die Hardware verbessern: den Bus, das Speichermedium usw. Sie können nur so viel tun, wenn Sie das Problem umgehen und nicht beheben müssen.
Der Zugriff auf Unix-Quellcode (noch vor Open Source) war weiter verbreitet. Wenn Sie also die Leistung verbessern möchten, sollten Sie dies zuerst in Software (billiger und einfacher) und dann in Hardware behandeln.
Infolgedessen haben viele Menschen auf der Welt promoviert, indem sie das Unix-Dateisystem studiert und neue Wege gefunden haben, um die Leistung zu verbessern.
Unix tendiert zu vielen kleinen Dateien. Windows tendiert zu wenigen (oder einer einzelnen) großen Datei.
Unix-Anwendungen verarbeiten in der Regel viele kleine Dateien. Stellen Sie sich eine Softwareentwicklungsumgebung vor: viele kleine Quelldateien, jede mit ihrem eigenen Zweck. In der letzten Phase (Verknüpfung) wird zwar eine große Datei erstellt, dies ist jedoch ein kleiner Prozentsatz.
Infolgedessen verfügt Unix über hochoptimierte Systemaufrufe zum Öffnen und Schließen von Dateien, Scannen von Verzeichnissen usw. Die Geschichte der Unix-Forschungsarbeiten umfasst Jahrzehnte von Dateisystemoptimierungen, bei denen viel über die Verbesserung des Verzeichniszugriffs (Lookups und vollständige Verzeichnisscans), das erstmalige Öffnen von Dateien usw. nachgedacht wurde.
Windows-Anwendungen neigen dazu, eine große Datei zu öffnen, sie lange offen zu halten und sie dann zu schließen. Denken Sie an MS-Word. msword.exe (oder was auch immer) öffnet die Datei einmal und hängt sie stundenlang an, aktualisiert interne Blöcke und so weiter. Der Wert der Optimierung des Öffnens der Datei wäre Zeitverschwendung.
In der Geschichte des Windows-Benchmarking und der Windows-Optimierung ging es darum, wie schnell man lange Dateien lesen oder schreiben kann. Das wird optimiert.
Leider hat die Softwareentwicklung in Richtung der ersten Situation tendiert. Heck, das beste Textverarbeitungssystem für Unix (TeX / LaTeX) empfiehlt Ihnen, jedes Kapitel in eine andere Datei zu legen und alle zusammen einzuschließen.
Unix konzentriert sich auf hohe Leistung; Windows konzentriert sich auf die Benutzererfahrung
Unix wurde im Serverraum gestartet: keine Benutzeroberfläche. Das einzige, was Benutzer sehen, ist Geschwindigkeit. Geschwindigkeit hat daher Priorität.
Windows wurde auf dem Desktop gestartet: Benutzer kümmern sich nur um das, was sie sehen, und sie sehen die Benutzeroberfläche. Daher wird mehr Energie für die Verbesserung der Benutzeroberfläche aufgewendet als für die Leistung.
Das Windows-Ökosystem hängt von der geplanten Veralterung ab. Warum Software optimieren, wenn neue Hardware nur ein oder zwei Jahre entfernt ist?
Ich glaube nicht an Verschwörungstheorien, aber wenn ich das tun würde, würde ich darauf hinweisen, dass es in der Windows-Kultur weniger Anreize gibt, die Leistung zu verbessern. Windows-Geschäftsmodelle hängen davon ab, dass Menschen neue Maschinen wie ein Uhrwerk kaufen. (Aus diesem Grund ist der Aktienkurs von Tausenden von Unternehmen betroffen, wenn MS ein Betriebssystem verspätet ausliefert oder wenn Intel ein Veröffentlichungsdatum für Chips verpasst.) Dies bedeutet, dass es einen Anreiz gibt, Leistungsprobleme zu lösen, indem die Leute aufgefordert werden, neue Hardware zu kaufen. nicht durch die Verbesserung des eigentlichen Problems: langsame Betriebssysteme. Unix kommt aus dem akademischen Bereich, wo das Budget knapp ist und Sie promovieren können, indem Sie eine neue Methode erfinden, um Dateisysteme schneller zu machen. Selten erhält jemand in der Wissenschaft Punkte für die Lösung eines Problems durch Erteilung einer Bestellung.
Da Unix Open Source ist (auch wenn dies nicht der Fall war, hatte jeder Zugriff auf die Quelle), kann jeder gelangweilte Doktorand den Code lesen und berühmt werden, indem er ihn verbessert. Dies ist in Windows nicht der Fall (MS verfügt über ein Programm, mit dem Akademiker auf Windows-Quellcode zugreifen können, das nur selten genutzt wird). Schauen Sie sich diese Auswahl von Unix-bezogenen Performance-Papieren an: http://www.eecs.harvard.edu/margo/papers/ oder schauen Sie sich die Geschichte der Papiere von Osterhaus, Henry Spencer oder anderen an. Heck, eine der größten (und erfreulichsten) Debatten in der Unix-Geschichte war das Hin und Her zwischen Osterhaus und Selzer http://www.eecs.harvard.edu/margo/papers/usenix95-lfs/supplement/rebuttal. html In der Windows-Welt sieht man so etwas nicht. Möglicherweise sehen Sie Anbieter, die sich gegenseitig verbessern, aber das scheint in letzter Zeit viel seltener zu sein, da die Innovation anscheinend alle auf der Ebene der Standardkörper liegt.
So sehe ich das.
Update: Wenn Sie sich die neuen Compilerketten ansehen, die von Microsoft kommen, werden Sie sehr optimistisch sein, da vieles, was sie tun, es einfacher macht, die gesamte Toolchain im RAM zu halten und weniger Arbeit zu wiederholen. Sehr beeindruckendes Zeug.
quelle
Inkrementelle Verknüpfung
Wenn die VC 2008-Lösung als mehrere Projekte mit .lib-Ausgaben eingerichtet ist, müssen Sie "Use Library Dependency Inputs" festlegen. Dadurch wird der Linker direkt mit den OBJ-Dateien und nicht mit der LIB verknüpft. (Und macht es tatsächlich inkrementell verknüpfen.)
Durchlaufleistung des Verzeichnisses
Es ist etwas unfair, das Crawlen von Verzeichnissen auf dem ursprünglichen Computer mit dem Crawlen eines neu erstellten Verzeichnisses mit denselben Dateien auf einem anderen Computer zu vergleichen. Wenn Sie einen gleichwertigen Test wünschen, sollten Sie wahrscheinlich eine weitere Kopie des Verzeichnisses auf dem Quellcomputer erstellen. (Es kann immer noch langsam sein, aber das kann auf eine Reihe von Faktoren zurückzuführen sein: Festplattenfragmentierung, kurze Dateinamen, Hintergrunddienste usw.) Obwohl ich denke, dass die Perf-Probleme
dir /s
mehr mit dem Schreiben der Ausgabe als mit dem Messen der tatsächlichen Datei zu tun haben Durchquerungsleistung. Auchdir /s /b > nul
ist auf meinem Computer mit einem riesigen Verzeichnis langsam.quelle
Ich bin mir ziemlich sicher, dass es mit dem Dateisystem zusammenhängt. Ich arbeite an einem plattformübergreifenden Projekt für Linux und Windows, bei dem der gesamte Code gemeinsam ist, außer wenn plattformabhängiger Code unbedingt erforderlich ist. Wir verwenden Mercurial, nicht Git, daher gilt die "Linuxness" von Git nicht. Das Abrufen von Änderungen aus dem zentralen Repository dauert unter Windows im Vergleich zu Linux ewig, aber ich muss sagen, dass unsere Windows 7-Computer viel besser abschneiden als die Windows XP-Computer. Das Kompilieren des Codes danach ist in VS 2008 noch schlimmer. Es ist nicht nur hg; CMake läuft auch unter Windows viel langsamer, und beide Tools verwenden das Dateisystem mehr als alles andere.
Das Problem ist so schlimm, dass die meisten unserer Entwickler, die in einer Windows-Umgebung arbeiten, sich nicht einmal mehr um inkrementelle Builds kümmern - sie finden, dass das Erstellen eines Unity- Builds schneller ist.
Übrigens, wenn Sie die Kompilierungsgeschwindigkeit in Windows drastisch verringern möchten, würde ich den oben genannten Unity-Build vorschlagen. Die korrekte Implementierung im Build-System ist mühsam (ich habe es für unser Team in CMake getan), aber wenn dies einmal erledigt ist, werden die Dinge für unsere Continuous Integration Server automatisch beschleunigt. Abhängig davon, wie viele Binärdateien Ihr Build-System ausspuckt, können Sie eine Verbesserung um 1 bis 2 Größenordnungen erzielen. Ihr Kilometerstand kann variieren. In unserem Fall hat es meiner Meinung nach die Linux-Builds um das Dreifache und die Windows-Builds um den Faktor 10 beschleunigt, aber wir haben viele gemeinsam genutzte Bibliotheken und ausführbare Dateien (was die Vorteile eines Unity-Builds verringert).
quelle
Wie bauen Sie Ihr großes plattformübergreifendes Projekt auf? Wenn Sie gängige Makefiles für Linux und Windows verwenden, können Sie die Windows-Leistung leicht um den Faktor 10 beeinträchtigen, wenn die Makefiles unter Windows nicht so schnell sind.
Ich habe gerade einige Makefiles eines plattformübergreifenden Projekts mit allgemeinen (GNU) Makefiles für Linux und Windows repariert. Make startet einen
sh.exe
Prozess für jede Zeile eines Rezepts, der den Leistungsunterschied zwischen Windows und Linux verursacht!Nach Angaben der GNU Dokumentation erstellen
sollte das Problem lösen, aber diese Funktion wird (derzeit) für Windows make nicht unterstützt. Das Umschreiben der Rezepte in einzelne logische Zeilen (z. B. durch Hinzufügen von; \ oder \ am Ende der aktuellen Editorzeilen) hat also sehr gut funktioniert!
quelle
IMHO dreht sich alles um die Leistung der Festplatten-E / A. Die Größenordnung legt nahe, dass viele Vorgänge unter Windows auf die Festplatte übertragen werden, während sie unter Linux im Speicher ausgeführt werden, dh Linux wird besser zwischengespeichert. Unter Windows können Sie Ihre Dateien am besten auf eine schnelle Festplatte, einen Server oder ein Dateisystem verschieben. Erwägen Sie den Kauf eines Solid State Drive oder das Verschieben Ihrer Dateien auf eine Ramdisk oder einen schnellen NFS-Server.
Ich habe die Verzeichnisdurchlauftests durchgeführt und die Ergebnisse liegen sehr nahe an den angegebenen Kompilierungszeiten, was darauf hindeutet, dass dies überhaupt nichts mit CPU-Verarbeitungszeiten oder Compiler / Linker-Algorithmen zu tun hat.
Gemessene Zeiten wie oben vorgeschlagen beim Durchlaufen des Chromverzeichnisbaums:
Für die Tests habe ich die Chromquellen gezogen (beide unter Win / Linux)
Um die Zeit zu messen, die ich lief
Ich habe die Zugriffszeitstempel und meinen Virenscanner deaktiviert und die Cache-Manager-Einstellungen unter Windows (> 2 GB RAM) erhöht - alles ohne merkliche Verbesserungen. Tatsache ist, dass Linux mit einem Viertel des Arbeitsspeichers 50-mal besser abschneidet als Windows.
Für alle, die behaupten wollen, dass die Zahlen - aus welchen Gründen auch immer - falsch sind, probieren Sie es bitte aus und veröffentlichen Sie Ihre Ergebnisse.
quelle
Versuchen Sie es mit jom anstelle von nmake
Erhalten Sie es hier: https://github.com/qt-labs/jom
Tatsache ist, dass nmake nur einen Ihrer Kerne verwendet. Jom ist ein Klon von nmake, der Multicore-Prozessoren verwendet.
GNU macht dies dank der Option -j sofort möglich. Dies könnte ein Grund für die Geschwindigkeit im Vergleich zu Microsoft nmake sein.
jom arbeitet mit der parallelen Ausführung verschiedener make-Befehle auf verschiedenen Prozessoren / Kernen. Probieren Sie es aus und spüren Sie den Unterschied!
quelle
Ich möchte nur eine Beobachtung mit Gnu make und anderen Tools von MinGW-Tools unter Windows hinzufügen: Sie scheinen Hostnamen aufzulösen, selbst wenn die Tools nicht einmal über IP kommunizieren können. Ich würde vermuten, dass dies durch eine Initialisierungsroutine der MinGW-Laufzeit verursacht wird. Das Ausführen eines lokalen DNS-Proxys hat mir geholfen, die Kompilierungsgeschwindigkeit mit diesen Tools zu verbessern.
Vorher hatte ich große Kopfschmerzen, weil die Build-Geschwindigkeit um den Faktor 10 abnahm, als ich parallel eine VPN-Verbindung eröffnete. In diesem Fall wurden alle diese DNS-Suchvorgänge über das VPN durchgeführt.
Diese Beobachtung könnte auch für andere Build-Tools gelten, die nicht nur auf MinGW basieren, und sie könnte sich inzwischen gegenüber der neuesten MinGW-Version geändert haben.
quelle
Ich konnte kürzlich eine andere Möglichkeit archivieren, um die Kompilierung unter Windows mit Gnu make um etwa 10% zu beschleunigen, indem ich die Datei mingw bash.exe durch die Version von win-bash ersetzte
(Die Win-Bash ist in Bezug auf die interaktive Bearbeitung nicht sehr komfortabel.)
quelle