În front-end-ul compilatorului Rust, care realizează sarcini precum analiza sintactică, verificarea tipurilor și analiza împrumuturilor, a fost implementat suport pentru execuția paralelă, ceea ce permite reducerea semnificativă a timpului de compilare. Paralele secvențele sunt deja disponibile în versiunile nocturne ale Rust și pot fi activate folosind opțiunea „-Z threads=8”. O astfel de funcționalitate este planificată pentru a fi inclusă în ramura stabilă în 2024.
Reducerea timpului de compilare în Rust a fost un obiectiv de lucru de câțiva ani. În primele 10 luni ale anului 2023, timpul de compilare a fost redus în medie cu 13%, consumul maxim de memorie a scăzut cu 15%, iar dimensiunea fișierelor generate s-a micșorat cu 7%. În această etapă, accelerarea a fost realizată prin optimizări ale compilatorului în sine. Ulterior, dezvoltatorii s-au concentrat pe accelerarea procesului prin paralelizarea operațiunilor în timpul compilării.
Până acum, paralelizarea în Rust a fost realizată în principal la nivel de procese. De exemplu, managerul de pachete Cargo poate rula mai multe procese rustc pentru compilarea simultană a mai multor pachete. Suportul pentru paralelizare există și pe partea de backend, care efectuează operațiuni legate de generarea codului — backendul Rust poate genera cod în părți, care pot fi apoi procesate în paralel de LLVM. În continuare, front-endul a fost capabil să proceseze codul sursă doar în mod unic.
Pentru a sprijini paralelizarea, front-endul a fost transformat pentru a utiliza biblioteca Rayon și a fost semnificativ revizuit, de exemplu, multe dintre părțile sale sunt acum sincronizate folosind mutexuri și blocări de citire/scriere, iar în cod sunt utilizate tipuri atomice. În testele de performanță, noua implementare paralelizată putea efectua compilarea cu până la 2% mai lentă în modul unic (-Z threads=1), dar când numărul de fire de execuție depășește unu, viteza crește semnificativ. De exemplu, la setarea a 8 fire de execuție (-Z threads=8), în anumite situații, timpul de compilare a fost redus cu 50%.
Rezultatul depinde semnificativ de setările mediu și de codul compilat — pentru programe foarte mici, care se compilează rapid, compilarea în mod multithread poate fi mai lentă. În plus, consumul de memorie în modul multithread poate crește semnificativ, de exemplu, în teste s-a observat o creștere a consumului de memorie de până la 35%.
Sursa: opennet.ro
