Nel frontend del compilatore Rust, che svolge compiti come analisi sintattica, controllo dei tipi e analisi dei prestiti, è stata implementata la supporto per l'esecuzione parallela, che consente di ridurre significativamente i tempi di compilazione. La parallelizzazione è già disponibile nelle build notturne di Rust ed è attivata tramite l'opzione «-Z threads=8». Si prevede di includere questa funzionalità nel ramo stabile nel 2024.
Il lavoro per ridurre i tempi di compilazione in Rust è in corso da diversi anni. Nei primi 10 mesi del 2023, i tempi di compilazione si sono ridotti in media del 13%, il picco di consumo di memoria è diminuito del 15% e la dimensione dei file generati è diminuita del 7%. A questo punto, l'accelerazione è stata raggiunta tramite ottimizzazioni del compilatore stesso. Successivamente, gli sviluppatori hanno iniziato a lavorare sull'accelerazione tramite la parallelizzazione delle operazioni durante la compilazione.
Fino ad ora, la parallelizzazione in Rust è stata principalmente fornita a livello di processi; ad esempio, il gestore di pacchetti Cargo può avviare più processi rustc per la compilazione simultanea di diversi pacchetti. Il supporto per la parallelizzazione è presente anche nel backend, che svolge operazioni legate alla generazione di codice: il backend di Rust può generare codice in parti, che successivamente LLVM può elaborare in parallelo. Tuttavia, il frontend potrà elaborare il codice sorgente solo in modalità monothread.
Per supportare la parallelizzazione, il frontend è stato convertito per utilizzare la libreria Rayon ed è stato notevolmente ristrutturato; ad esempio, molte delle sue parti ora sono sincronizzate tramite mutex e lock di lettura/scrittura, e vengono utilizzati tipi atomici nel codice. Durante i test delle prestazioni, la nuova implementazione parallelizzabile poteva eseguire la compilazione fino al 2% più lentamente mentre operava in modalità monothread (-Z threads=1), ma quando il numero di thread superava uno, la velocità aumentava significativamente. Ad esempio, impostando 8 thread (-Z threads=8), in alcune situazioni, i tempi di compilazione si sono ridotti del 50%.
Inoltre, il risultato dipende fortemente dalle impostazioni dell'ambiente e dal codice compilato: per programmi molto piccoli, che si compilano già rapidamente, la compilazione in modalità multithread potrebbe risultare più lenta. Inoltre, il consumo di memoria in modalità multithread può aumentare notevolmente; ad esempio, nei test si è osservato un aumento del consumo di memoria fino al 35%.
Fonte: opennet.ru
