Na parte frontal do compilador Rust, que realiza tarefas como análise sintática, verificação de tipos e análise de empréstimos, foi implementado suporte para execução paralela, permitindo uma redução significativa no tempo de compilação. A paralelização já está disponível nas compilações noturnas do Rust e pode ser ativada usando a opção "-Z threads=8". A inclusão dessa funcionalidade na versão estável está prevista para 2024.
Os esforços para reduzir o tempo de compilação no Rust vêm sendo realizados há vários anos. Nos primeiros 10 meses de 2023, o tempo de compilação médio diminuiu em 13%, o consumo de memória máximo foi reduzido em 15% e o tamanho dos arquivos gerados diminuiu em 7%. Neste estágio, a aceleração foi alcançada por meio de otimizações no próprio compilador. Após isso, os desenvolvedores começaram a trabalhar na aceleração por meio da paralelização das operações durante a compilação.
Até agora, a paralelização no Rust era fornecida principalmente no nível de processos, por exemplo, o gerenciador de pacotes Cargo pode iniciar vários processos rustc para compilar simultaneamente vários pacotes. O suporte à paralelização também está presente no lado do backend, que executa operações relacionadas à geração de código — o backend do Rust pode gerar código em partes, que posteriormente o LLVM pode processar em paralelo. No entanto, o frontend ainda conseguia processar o código-fonte apenas em modo de thread única.
Para dar suporte à paralelização, o frontend foi transferido para o uso da biblioteca Rayon e passou por uma reestruturação significativa; por exemplo, muitas de suas partes agora são sincronizadas usando mutexes e bloqueios de leitura/escrita, enquanto tipos atômicos são utilizados no código. Nos testes de desempenho, a nova implementação paralelizável conseguiu compilar até 2% mais devagar em modo de thread única (-Z threads=1), mas quando havia mais de uma thread, a velocidade aumentava significativamente. Por exemplo, ao configurar 8 threads (-Z threads=8), em algumas situações, o tempo de compilação foi reduzido em 50%.
O resultado depende fortemente das configurações do ambiente e do código compilado — para programas muito pequenos, que já são compilados rapidamente, a compilação em modo multithread pode ser mais lenta. Além disso, o consumo de memória em modo multithread pode aumentar significativamente; por exemplo, em testes, foi observado um aumento no consumo de memória de até 35%.
Fonte: opennet.ru
