it-swarm.com.de

Beschleunigen Sie die Kompilierzeit mit SSD

Ich möchte versuchen, die Kompilierzeit unserer C++ - Projekte zu beschleunigen. Sie haben ungefähr 3M Codezeilen.

Natürlich muss ich nicht immer jedes Projekt kompilieren, aber manchmal gibt es viele Quelldateien, die von anderen geändert wurden, und ich muss alle neu kompilieren (zum Beispiel, wenn jemand eine ASN.1 source aktualisiert Datei).

Ich habe gemessen, dass das Kompilieren eines Zwischenprojekts (das nicht alle Quelldateien umfasst) etwa drei Minuten dauert. Ich weiß, das ist nicht zu viel, aber manchmal ist es wirklich langweilig, auf ein Compile zu warten.

Ich habe versucht, den Quellcode auf eine SSD (eine alte OCZ Vertex 3 60 GB) zu verschieben, die im Benchmark-Vergleich 5 bis 60 Mal schneller ist als die Festplatte (insbesondere beim zufälligen Lesen/Schreiben). Trotzdem ist die Kompilierzeit fast gleich (vielleicht 2-3 Sekunden schneller, sollte aber eine Chance sein).

Wenn Sie die Visual Studio-Ablage auf SSD verschieben, kann dies zu einer zusätzlichen Leistungssteigerung führen.

Um die Frage zu vervollständigen: Ich habe einen W3520 Xeon mit 2,67 GHz und 12 GB DDR3-ECC.

20
Jamby

Die C++ - Kompilierung/Verknüpfung ist durch die Verarbeitungsgeschwindigkeit und nicht durch die Festplatten-E/A begrenzt. Das ist der Grund, warum Sie keine Steigerung der Kompilierungsgeschwindigkeit feststellen. (Das Verschieben der Compiler-/Linker-Binärdateien auf die SSD hat keine Auswirkungen. Wenn Sie ein großes Projekt kompilieren, werden der Compiler/Linker und die erforderliche Bibliothek einmal in den Speicher eingelesen und bleiben dort.)

Ich habe einige kleinere Beschleunigungen beim Verschieben des Arbeitsverzeichnisses auf eine SSD oder eine Ramdisk beim Kompilieren von C-Projekten gesehen (was viel weniger Zeit in Anspruch nimmt als C++ - Projekte, die häufig Vorlagen verwenden), aber nicht genug, um es wert zu sein.

9
us2012

Dies alles hängt stark von Ihrer Build-Umgebung und anderen Einstellungen ab. Zum Beispiel habe ich auf meinem Hauptcompilerserver 96 GiB RAM und 16 Cores. Die Festplatte ist ziemlich langsam, aber das spielt keine Rolle, da sich alles im RAM befindet.

Auf meinem Desktop (wo ich auch manchmal kompiliere) habe ich nur 8 Gib RAM und sechs Kerne. Wenn Sie den gleichen parallelen Build-Vorgang ausführen, kann dies erheblich beschleunigt werden, da sechs parallel laufende Compiler genügend Speicherplatz verbrauchen, damit der SSD-Geschwindigkeitsunterschied sehr deutlich wird.

Es gibt viele Faktoren, die die Erstellungszeiten beeinflussen, einschließlich des Verhältnisses von CPU zu E/A- "Grenze". Nach meiner Erfahrung ( GCC unter Linux) gehören dazu:

  • Komplexität des Codes. Bei vielen Metatemplates wird mehr CPU-Zeit benötigt, mehr C-ähnlicher Code kann die E/A der generierten Objekte (mehr) dominieren
  • Compilereinstellungen für temporäre Dateien wie -pipe für GCC.
  • Optimierung wird verwendet. Je mehr Optimierung, desto mehr dominiert die CPU-Arbeit.
  • Parallele Builds. Durch das Kompilieren einer einzelnen Datei werden wahrscheinlich nie genug E/A erzeugt, um die langsamste Festplatte von heute an ihre Grenzen zu bringen. Das Kompilieren mit acht Kernen (oder mehr) gleichzeitig kann jedoch erfolgen.
  • Betriebssystem/Dateisystem, das verwendet wird. Es hat den Anschein, dass einige Dateisysteme in der Vergangenheit das Zugriffsmuster für viele parallel gebaute Dateien blockiert haben, wodurch der E/A-Engpass eher in den Dateisystemcode als in die zugrunde liegende Hardware gestellt wird.
  • Verfügbar RAM zum Puffern. Je aggressiver ein Betriebssystem Ihre E/A puffern kann, desto geringer wird die Geschwindigkeit der Festplatte. Aus diesem Grund kann ein make -j6 manchmal langsamer sein als ein make -j4, obwohl er genügend freie Kerne hat.

Um es kurz zu machen: Es kommt auf genug Dinge an, um ein "Ja, es wird dir helfen" oder "Nein, es wird dir nicht helfen", reine Spekulation. Wenn du also die Möglichkeit hast, es auszuprobieren, mach es. Aber verbringen Sie nicht zu viel Zeit damit, jede Stunde, in der Sie versuchen, Ihre Kompilierzeiten zu halbieren, und schätzen Sie ab, wie oft Sie (oder Ihre Kollegen, falls Sie welche haben) das Projekt neu aufgebaut haben könnten und wie sich das darauf bezieht die mögliche Zeitersparnis.

26
PlasmaHH

Ich fand heraus, dass das Kompilieren eines Projekts von etwa 1 Million C++ -Zeilen um etwa den Faktor 2 beschleunigte, als der Code auf einer SSD (System mit einem Acht-Core Core i7 , 12 GB RAM) lag. Tatsächlich war die beste Leistung, die wir erzielten, mit einer SSD für das System und einer zweiten für die Quelle - es war nicht so, dass der Build viel schneller war, aber das Betriebssystem reagierte viel schneller, während ein großer Build im Gange war.

Das andere, was einen großen Unterschied machte, war das parallele Bauen. Beachten Sie, dass es zwei separate Optionen gibt, die beide aktiviert werden müssen:

  • Menü Extras Optionen Projekte und Lösungen → maximale Anzahl paralleler Projekterstellungen
  • Projekteigenschaften → C++/Allgemein Multiprozessor-Kompilierung

Die Multiprozessor-Kompilierung ist nicht kompatibel mit einigen anderen Flags (einschließlich minimalem Neuaufbau, denke ich). Überprüfen Sie also das Ausgabefenster auf Warnungen. Ich habe festgestellt, dass mit dem Compilierungs-Flag MP alle Kerne auf eine Auslastung von nahezu 100% stießen, sodass Sie zumindest sehen können, dass die CPU aggressiv verwendet wird.

4
the_mandrill

Ein Punkt, der nicht erwähnt wird, ist der, dass bei der Verwendung von ccache und einem sehr parallelen Build die Verwendung einer SSD von Vorteil ist.

0
nocnokneo