Tooling em .NET

Compilação “ahead-of-time” (ReadyToRun) no .NET Core 3

Em um post anterior, falamos dos potenciais ganhos de performance resultantes da opção de compilação em camadas, fornecida pelo JIT. Na prática, o JIT compila um mesmo código, múltiplas vezes, gerando, em cada nova compilação, um código ainda melhor que o anterior.

Além dessa nova opção, há também a alternativa de pedirmos que o compilador gere código nativo, junto com a compilação para a Intermediate Language (naquele mesmo processo que executamos no Visual Studio, por exemplo, e não durante a execução da aplicação). Essa opção ficou conhecida como ReadyToRun.

A compilação ReadyToRun pode ser ativada diretamente no arquivo de configuração.

<PropertyGroup>
  <PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>

O arquivo executável gerado ficará signficativamente maior. A razão para isso é que, por motivos de compatibilidade, tanto o código nativo quanto o IL vão estar no arquivo. Ou seja, além do tamanho do executável gerado pelo processo tradicional (somente com Intermediate Language), serão acrescidos os bytes relativos ao código nativo. Entretanto, o tempo para inicialização será muito menor.

Outro ponto importante de atenção é que, por razões óbvias, sua aplicação precisará ser self-contained e será necessário especificar o runtime onde a aplicação irá funcionar.

dotnet publish -c Release -r win-x64 --self-contained

Honestamente, exceto por cenários muito específicos, os ganhos de performance obtidos com essa opção são difíceis de justificar. Há aspectos mais importantes a considerar antes de recorrer a mudanças no processo de compilação.

Em Resumo
  • A novidade

    A partir do .NET Core 3, temos a opção de gerar código nativo junto com o IL, durante o primeiro processo de compilação. Isso pode reduzir o tempo de inicialização das aplicações.
  • Pontos positivos

    O tempo de inicialização da aplicação pode cair consideravelmente. Isso pode ser extremamente interessante em cenários bem específicos.
  • Pontos negativos

    Os arquivos binários gerados pela compilação são signficativamente maiores por acomodar, além do código nativo, o código IL. Além disso, essa compilação é, obrigatoriamente, por razões óbvias, self-contained e com target fixo determinado.

Mais posts da série Tooling em .NET

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *