W frontendzie kompilatora Rust, który wykonuje zadania takie jak analiza składniowa, sprawdzanie typów i analiza pożyczek, została wdrożona obsługa równoległego wykonania, co znacząco skraca czas kompilacji. Równoległe przetwarzanie jest już dostępne w nocnych wersjach Rust i włącza się za pomocą opcji „-Z threads=8”. W stabilnej gałęzi planuje się wprowadzenie tej możliwości w 2024 roku.
Prace nad skracaniem czasu kompilacji w Rust trwają już od kilku lat. W ciągu pierwszych 10 miesięcy 2023 roku średni czas kompilacji skrócił się o 13%, szczytowe wykorzystanie pamięci zmniejszyło się o 15%, a rozmiar generowanych plików zmniejszył się o 7%. Na tym etapie przyspieszenie zostało osiągnięte dzięki optymalizacjom samego kompilatora. Następnie deweloperzy przeszli do prac nad przyspieszeniem poprzez równoległe wykonywanie operacji podczas kompilacji.
Dotychczas równoległe przetwarzanie w Rust odbywało się głównie na poziomie procesów; na przykład menedżer pakietów Cargo może uruchomić kilka procesów rustc do jednoczesnej kompilacji kilku pakietów. Obsługa równoległego przetwarzania jest również obecna po stronie backendu, który wykonuje operacje związane z generowaniem kodu — backend Rust może generować kod w częściach, które następnie LLVM może przetwarzać równolegle. Frontend jednak dotychczas mógł przetwarzać kod źródłowy tylko w trybie jednowątkowym.
Aby wspierać równoległe przetwarzanie, frontend został przekształcony w korzystaniu z biblioteki Rayon i znacznie przerobiony; na przykład wiele jego części synchronizowanych jest teraz za pomocą mutexów i blokad do odczytu/zapisu, a w kodzie używane są typy atomowe. Podczas testów wydajności nowa równoległa implementacja mogła wykonywać kompilację do 2% wolniej w trybie jednowątkowym (-Z threads=1), ale przy więcej niż jednym wątku prędkość znacznie wzrastała. Na przykład przy ustawieniu 8 wątków (-Z threads=8) w niektórych sytuacjach czas kompilacji udało się skrócić o 50%.
Wynik w dużym stopniu zależy od ustawień środowiska i kompilowanego kodu — dla bardzo małych programów, które i tak kompilują się szybko, kompilacja w trybie wielowątkowym może przebiegać wolniej. Ponadto, zużycie pamięci w trybie wielowątkowym może znacząco wzrosnąć, na przykład w testach odnotowano wzrost zużycia pamięci o 35%.
Źródło: opennet.ru
