В ночных сборках Rust расширены возможности распараллеливания компиляции

Во фронтэнде компилятора Rust, выполняющем такие задачи, как синтаксический анализ, проверка типов и анализ заимствований, реализована поддержка параллельного выполнения, позволяющего существенно сократить время компиляции. Распараллеливание уже доступно в ночных сборках Rust и включается при помощи опции »-Z threads=8». В стабильную ветку рассматриваемую возможность планируют включить в 2024 году.

Работа над сокращением времени компиляции в Rust ведётся уже несколько лет. За первые 10 месяцев 2023 года время компиляции сократилось в среднем на 13%, пиковое потребление памяти снизилось на 15%, а размер генерируемых файлов уменьшился на 7%. На данном этапе ускорение было достигнуто за счёт оптимизаций самого компилятора. На новом этапе разработчики намерены добиться значительного ускорения за счёт обеспечения распараллеливания операций во время компиляции.

До сих пор распараллеливание в Rust обеспечивалась в основном на уровне процессов, например, пакетный менеджер Cargo может запускать несколько процессов rustc для одновременной компиляции нескольких пакетов. Поддержка распараллеливания также присутствует на стороне бэкенда, выполняющего операции, связанные с генерацией кода — бэкенд Rust может генерировать код частями, которые в дальнейшем LLVM может обрабатывать параллельно. Фронтэнд же до сих пор мог обрабатывать исходный код только в однопоточном режиме.

Для поддержки распараллеливания фронтэнд переведён на использование библиотеки Rayon и значительно переработан, например, многие его части теперь синхронизируются с помощью мьютексов и блокировок чтения/записи, используются атомарные типы. При тестировании производительности новая распараллеливаемая реализация может выполнять компиляцию до 2% медленнее при работе в однопоточном режиме (-Z threads=1), но когда потоков больше одного скорость значительно возрастает. Например, при установке 8 потоков (-Z threads=8) время компиляции может сократиться на 50%.

При этом результат сильно зависит от настроек окружения и компилируемого кода — для очень маленьких программ, которые и так компилируются быстро, компиляция в многопоточном режиме может выполняться медленнее. Кроме того, потребление памяти в многопоточном режиме может значительно увеличиться, например, в тестах наблюдался рост потребления памяти до 35%.



Источник: http://www.opennet.ru/opennews/art.shtml? num=60095

©  OpenNet