Le frontal du compilateur Rust, qui effectue des tâches telles que l'analyse syntaxique, la vérification de type et l'analyse d'emprunt, prend en charge l'exécution parallèle, ce qui peut réduire considérablement le temps de compilation. La parallélisation est déjà disponible dans les versions nocturnes de Rust et est activée à l'aide de l'option « -Z threads=8 ». L’opportunité à l’étude devrait être incluse dans la branche stable en 2024.
Les travaux visant à réduire les temps de compilation dans Rust se poursuivent depuis plusieurs années. Au cours des 10 premiers mois de 2023, les temps de compilation ont été réduits en moyenne de 13 %, la consommation maximale de mémoire a été réduite de 15 % et la taille des fichiers générés a été réduite de 7 %. À ce stade, l'accélération a été obtenue grâce à des optimisations du compilateur lui-même. Après cela, les développeurs ont travaillé sur l’accélération en parallélisant les opérations au moment de la compilation.
Jusqu'à présent, la parallélisation dans Rust se faisait principalement au niveau du processus ; par exemple, le gestionnaire de packages Cargo peut lancer plusieurs processus rustc pour compiler plusieurs packages en même temps. La prise en charge de la parallélisation est également présente du côté du backend, qui effectue des opérations liées à la génération de code - le backend Rust peut générer du code en plusieurs parties, que LLVM peut ensuite traiter en parallèle. Jusqu'à présent, le frontend ne pouvait traiter le code source qu'en mode monothread.
Pour prendre en charge la parallélisation, l'interface a été basculée vers la bibliothèque Rayon et a été considérablement repensée. Par exemple, bon nombre de ses parties sont désormais synchronisées à l'aide de mutex et de verrous de lecture/écriture, et le code utilise des types atomiques. Lors des tests de performances, la nouvelle implémentation parallélisable pouvait compiler jusqu'à 2 % plus lentement lorsqu'elle était exécutée en mode monothread (-Z threads=1), mais lorsqu'il y avait plus d'un thread, la vitesse augmentait considérablement. Par exemple, lors de l'installation de 8 threads (-Z threads=8), dans certaines situations, le temps de compilation peut être réduit de 50 %.
Dans ce cas, le résultat dépend fortement des paramètres de l'environnement et du code compilé - pour les très petits programmes qui se compilent déjà rapidement, la compilation en mode multithread peut être plus lente. De plus, la consommation de mémoire en mode multithread peut augmenter considérablement : par exemple, lors des tests, une augmentation de la consommation de mémoire allant jusqu'à 35 % a été observée.
Source: opennet.ru
