Otimizações orientadas a perfil

A PGO (otimização guiada por perfil) permite otimizar um arquivo executável inteiro, em que o otimizador usa dados de execuções de teste do arquivo .exe ou .dll. Os dados representam o desempenho provável do programa em um ambiente de produção.

As otimizações guiadas por perfil só estão disponíveis para destinos nativos x86, x64 ou ARM64. Otimizações guiadas por perfil não estão disponíveis para arquivos executáveis executados no Common Language Runtime. Mesmo se você produzir um assembly com código nativo e gerenciado misto (usando a opção do compilador /clr), não poderá usar a otimização guiada por perfil apenas no código nativo. Se você tentar compilar um projeto com essas opções definidas no IDE, ocorrerá um erro de compilação.

Observação

As informações coletadas das execuções de teste de criação de perfil substituem as otimizações que, de outra forma, estariam em vigor ao especificar /Ob, /Os ou /Ot. Para obter mais informações, consulte /Ob (Expansão de Função Embutida) e /Os, /Ot (Favorecer Código Menor, Favorecer Código Rápido).

Etapas para otimizar o aplicativo

Para usar a otimização guiada por perfil, siga estas etapas para otimizar o aplicativo:

  • Compile um ou mais arquivos de código-fonte com /GL.

    Cada módulo compilado com /GL poderá ser examinado durante as execuções de teste de otimização guiadas por perfil para capturar o comportamento em tempo de execução. Cada módulo em uma compilação de otimização guiada por perfil não precisa ser compilado com /GL. No entanto, apenas os módulos compilados com /GL são instrumentados e disponibilizados posteriormente para otimizações guiadas por perfil.

  • Vincule usando /LTCG e /GENPROFILE ou /FASTGENPROFILE.

    O uso de /LTCG e /GENPROFILE ou de /FASTGENPROFILE criará um arquivo .pgd quando o aplicativo instrumentado for executado. Após adicionar os dados de execução de teste ao arquivo .pgd, será possível usá-los como entrada para a próxima etapa de vinculação (criar a imagem otimizada). Ao especificar /GENPROFILE, como opção, você poderá adicionar um argumento PGD=filename para especificar um nome ou local não padrão para o arquivo .pgd. A combinação de opções do vinculador /LTCG e /GENPROFILE ou /FASTGENPROFILE substitui a opção de vinculador /LTCG:PGINSTRUMENT preterida.

  • Crie o perfil do aplicativo.

    Sempre que uma sessão EXE com perfil encerrar ou uma DLL com perfil descarregar, um arquivo appname!N.pgc será criado. Um arquivo .pgc contém as informações sobre uma execução de teste de aplicativo específica. appname é o nome do aplicativo e N é um número começando com 1 que é incrementado com base no número de outros arquivos appname!N.pgc no diretório. Você poderá excluir um arquivo .pgc se a execução de teste não representar um cenário que você quer otimizar.

    Durante uma execução de teste, você poderá forçar o fechamento do arquivo .pgc aberto no momento e a criação de um novo arquivo .pgc com o utilitário pgosweep (por exemplo, quando o final de um cenário de teste não coincidir com o desligamento do aplicativo).

    O aplicativo também poderá invocar diretamente uma função de PGO, PgoAutoSweep, para capturar os dados do perfil no ponto da chamada como um arquivo .pgc. Isso poderá fornecer um controle mais preciso sobre o código coberto pelos dados capturados nos arquivos .pgc. Para um exemplo de como usar essa função, consulte a documentação do PgoAutoSweep.

    Quando você cria o build instrumentado, por padrão a coleta de dados é feita no modo não thread-safe, que é mais rápido mas pode ser impreciso. Usando o argumento EXACT para /GENPROFILE ou /FASTGENPROFILE, será possível especificar a coleta de dados no modo thread-safe, que é mais preciso, porém mais lento. Essa opção também estará disponível se você definir a variável de ambiente PogoSafeMode preterida ou a opção do vinculador /POGOSAFEMODE ao criar o build instrumentado.

  • Vincule usando /LTCG e /USEPROFILE.

    Use ambas as opções do vinculador /LTCG e /USEPROFILE para criar a imagem otimizada. Essa etapa usa como entrada o arquivo .pgd. Ao especificar /USEPROFILE, você poderá adicionar como opção um argumento PGD=filename para especificar um nome ou local não padrão para o arquivo .pgd. É possível também especificar esse nome usando a opção do vinculador /PGD preterida. A combinação de /LTCG e /USEPROFILE substitui as opções do vinculador /LTCG:PGOPTIMIZE e /LTCG:PGUPDATE preteridas.

Além disso, é possível criar o arquivo executável otimizado e, posteriormente, determinar que perfis adicionais seriam úteis para criar uma imagem mais otimizada. Se a imagem instrumentada e o arquivo .pgd estiverem disponíveis, você poderá fazer execuções de teste adicionais e recompilar a imagem otimizada com o arquivo .pgd mais recente, usando as mesmas opções do vinculador /LTCG e /USEPROFILE.

Observação

Ambos os arquivos .pgc e .pgd são tipos de arquivos binários. Se armazenados em um sistema de controle de origem, evite qualquer transformação automática que possa ser feita em arquivos de texto.

Otimizações realizadas por PGO

As otimizações guiadas por perfil incluem estas verificações e melhorias:

  • Embutindo: por exemplo, se uma função A chama frequentemente a função B e a função B é relativamente pequena, então, as otimizações guiadas por perfil embutem a função B na função A.

  • Especulação de chamadas virtuais: se uma chamada virtual, ou outra chamada por meio de um ponteiro de função, frequentemente é destinada a uma determinada função, uma otimização guiada por perfil poderá inserir uma chamada direta executada condicionalmente para a função de destino frequente e a chamada direta poderá ser embutida.

  • Alocação de registros: a otimização baseada em dados de perfil resulta em melhor alocação de registros.

  • Otimização de bloco básico: a otimização de bloco básico permite que blocos básicos normalmente executados, que executam temporalmente dentro de um determinado quadro, sejam colocados no mesmo conjunto de páginas (localidade). Isso minimiza o número de páginas usadas, o que reduz a sobrecarga de memória.

  • Otimização de tamanho/velocidade: funções em que o programa gasta mais tempo de execução podem ser otimizadas para velocidade.

  • Layout de função: com base no grafo de chamadas e no comportamento do chamador/chamado com perfil, as funções que tendem a estar no mesmo caminho de execução são colocadas na mesma seção.

  • Otimização de ramificação condicional: com as investigações de valor, as otimizações guiadas por perfil poderão descobrir se um determinado valor em uma instrução switch é usado com mais frequência do que outros valores. Em seguida, esse valor poderá ser retirado da instrução switch. É possível fazer o mesmo com as instruções if...else, em que o otimizador poderá ordenar if...else para que o bloco if ou else seja colocado primeiro, dependendo de qual bloco é mais frequentemente verdadeiro.

  • Separação de código morto: o código que não é chamado durante a criação de perfil é movido para uma seção especial anexada ao final do conjunto de seções. Isso efetivamente mantém essa seção fora das páginas mais usadas.

  • Separação de Código EH: como o código EH executa apenas excepcionalmente, muitas vezes poderá ser movido para uma seção separada. Ele é movido quando as otimizações guiadas por perfil podem determinar que as exceções ocorrem apenas em condições excepcionais.

  • Intrínsecos de memória: expandir ou não um intrínseco depende da frequência com que é chamado. Também é possível otimizar um intrínseco com base no tamanho do bloco de movimentos ou cópias.

Próximas etapas

Leia mais sobre estas variáveis de ambiente, funções e ferramentas que podem ser usadas em otimizações guiadas por perfil:

Variáveis de ambiente para otimizações guiadas por perfil
Essas variáveis foram usadas para especificar o comportamento em tempo de execução dos cenários de teste. Agora estão preteridas e foram substituídas por novas opções do vinculador. Este documento mostra como passar das variáveis de ambiente para as opções do vinculador.

PgoAutoSweep
Uma função que você pode adicionar ao aplicativo para fornecer controle de captura de dados de arquivo .pgc refinado.

pgosweep
Um utilitário de linha de comando que grava todos os dados de perfil no arquivo .pgc, fecha o arquivo .pgc e abre um novo arquivo .pgc.

pgomgr
Um utilitário de linha de comando que adiciona dados de perfil de um ou mais arquivos .pgc ao arquivo .pgd.

Como: mesclar vários perfis PGO em um único perfil
Exemplos de uso de pgomgr.

Confira também

Ferramentas de compilação adicionais MSVC