Im Frontend des Rust-Compilers, der Aufgaben wie die syntaktische Analyse, Typprüfung und Borrowing-Analyse ausführt, wurde die Unterstützung für parallele Ausführung implementiert, die es ermöglicht, die Kompilierungszeit erheblich zu verkürzen. Die Parallelisierung ist bereits in den nächtlichen Versionen von Rust verfügbar und wird über die Option „-Z threads=8“ aktiviert. Der Plan, diese Möglichkeit in die stabile Version einzuführen, besteht für das Jahr 2024.
Die Arbeiten zur Reduzierung der Kompilierungszeiten in Rust laufen bereits seit mehreren Jahren. In den ersten 10 Monaten des Jahres 2023 wurde die Kompilierungszeit im Durchschnitt um 13 % verkürzt, der Spitzenbedarf an Speicher fiel um 15 %, und die Größe der erzeugten Dateien verringerte sich um 7 %. In diesem Stadium wurde die Beschleunigung durch Optimierungen des Compilers selbst erreicht. Anschließend konzentrierten sich die Entwickler auf die Beschleunigung durch die Parallelisierung von Operationen während der Kompilierung.
Bisher wurde die Parallelisierung in Rust hauptsächlich auf Prozessebene sichergestellt, zum Beispiel kann der Paketmanager Cargo mehrere Prozesse von rustc starten, um mehrere Pakete gleichzeitig zu kompilieren. Die Unterstützung für Parallelisierung gibt es auch auf der Backend-Seite, die Operationen zur Codegenerierung ausführt – das Rust-Backend kann Code in Teilen generieren, die anschließend von LLVM parallel verarbeitet werden können. Das Frontend konnte bisher nur den Quellcode im Einzelthread-Modus verarbeiten.
Zur Unterstützung der Parallelisierung wurde das Frontend auf die Verwendung der Bibliothek Rayon umgestellt und erheblich überarbeitet, zum Beispiel synchronisieren sich viele Teile jetzt mit Hilfe von Mutexen und Lese-/Schreibsperren, und im Code werden atomare Typen verwendet. Bei Leistungstests konnte die neue parallelisierbare Implementierung die Kompilierung im Einzelthread-Modus (-Z threads=1) um bis zu 2 % langsamer durchführen, aber bei mehr als einem Thread stieg die Geschwindigkeit erheblich. Zum Beispiel konnte bei der Einstellung von 8 Threads (-Z threads=8) in bestimmten Situationen die Kompilierungszeit um 50 % verkürzt werden.
Das Ergebnis hängt stark von den Umgebungs- und Kompilierungseinstellungen ab – für sehr kleine Programme, die ohnehin schnell kompiliert werden, kann die Kompilierung im Mehrfachmodus langsamer verlaufen. Darüber hinaus kann der Speicherverbrauch im Mehrfachmodus erheblich steigen; in Tests wurde ein Anstieg des Speicherverbrauchs von bis zu 35 % beobachtet.
Quelle: opennet.ru
