Partilhar via


Otimizações guiadas por perfil

A otimização guiada por perfil (PGO) permite otimizar um arquivo executável inteiro, onde 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. As otimizações guiadas por perfil não estão disponíveis para arquivos executáveis executados no Common Language Runtime. Mesmo que você produza um assembly com código nativo e gerenciado misto (usando a opção de compilador /clr ), não poderá usar a otimização guiada por perfil apenas no código nativo. Se você tentar criar um projeto com essas opções definidas no IDE, ocorrerá um erro de compilação.

Observação

As informações recolhidas a partir de execuções de testes de perfil substituem otimizações que, de outra forma, seriam aplicadas caso especifique /Ob, /Os ou /Ot. Para obter mais informações, consulte /Ob (Inline Function Expansion) e /Os, /Ot (Favor Small Code, Favor Fast Code).

Etapas para otimizar seu aplicativo

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

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

    Cada módulo construído com /GL pode ser examinado durante 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 posteriormente disponibilizados para otimizações guiadas por perfil.

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

    Utilizar /LTCG e /GENPROFILE ou /FASTGENPROFILE cria um .pgd ficheiro ao executar a aplicação instrumentada. Depois que os dados de execução de teste .pgd são adicionados ao arquivo, eles podem ser usados como entrada para a próxima etapa do processo de ligação (criação da imagem otimizada). Ao especificar /GENPROFILE, você pode, opcionalmente, adicionar um argumento PGD=filename para especificar um nome ou local não padrão para o .pgd arquivo. A combinação das opções de vinculador /LTCG e /GENPROFILE ou /FASTGENPROFILE substitui a opção de vinculador /LTCG:PGINSTRUMENT obsoleta.

  • Crie o perfil do aplicativo.

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

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

    O seu aplicativo também pode invocar diretamente uma função PGO, PgoAutoSweep. Esta função serve para capturar os dados do perfil no ponto da chamada como um .pgc ficheiro. Ele pode lhe dar um controle mais fino sobre o código coberto pelos dados capturados em seus .pgc arquivos. Para obter um exemplo de como usar essa função, consulte a documentação do PgoAutoSweep .

    Quando você cria sua compilação instrumentada, 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, você pode especificar a coleta de dados no modo thread-safe, que é mais preciso, mas mais lento. Essa opção também estará disponível se você definir a variável de ambiente PogoSafeMode preterida ou a opção de vinculador /POGOSAFEMODE preterida ao criar sua compilação instrumentada.

  • Link usando /LTCG e /USEPROFILE.

    Use as opções de vinculador /LTCG e /USEPROFILE para criar a imagem otimizada. Esta etapa toma como entrada o .pgd arquivo. Ao especificar /USEPROFILE, você pode, opcionalmente, adicionar um argumento PGD=filename para especificar um nome ou local não padrão para o .pgd arquivo. Você também pode especificar esse nome usando a opção de vinculador /PGD obsoleta. A combinação de /LTCG e /USEPROFILE substitui as opções obsoletas do vinculador /LTCG:PGOPTIMIZE e /LTCG:PGUPDATE .

É até possível criar o arquivo executável otimizado e, mais tarde, determinar que a criação de perfil adicional seria útil para criar uma imagem mais otimizada. Se a imagem instrumentada e seu .pgd arquivo estiverem disponíveis, você poderá fazer execuções de teste adicionais e reconstruir a imagem otimizada com o arquivo mais recente .pgd , usando as mesmas opções de vinculador /LTCG e /USEPROFILE .

Observação

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

Otimizações realizadas pelo PGO

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

  • Inlining - Por exemplo, se uma função A frequentemente chama a função B e a função B é relativamente pequena, então otimizações guiadas por perfil incluem a função B em linha na função A.

  • Especulação de chamada virtual - Se uma chamada virtual, ou outra chamada através de um ponteiro de função, frequentemente aponta para uma determinada função, uma otimização guiada por perfil pode inserir uma chamada direta executada de forma condicional para a função frequentemente visada, e a chamada direta pode ser integrada.

  • Alocação de Registros - A otimização baseada em dados de perfil resulta em melhor alocação de registos.

  • Otimização básica de blocos - A otimização básica de blocos permite que blocos básicos comumente executados que são executados temporalmente dentro de um determinado quadro sejam colocados no mesmo conjunto de páginas (localidade). Ele minimiza o número de páginas usadas, o que minimiza a sobrecarga de memória.

  • Otimização de tamanho/velocidade - Funções onde o programa gasta mais tempo de execução podem ser otimizadas para velocidade.

  • Layout da função - Com base no gráfico de chamadas e no comportamento do chamador/chamado perfilado, as funções que tendem a estar ao longo do mesmo caminho de execução são agrupadas na mesma secção.

  • Otimização de ramificação condicional - Com as sondas de valor, as otimizações guiadas por perfil podem descobrir se um determinado valor em uma instrução switch é usado com mais frequência do que outros valores. Esse valor pode então ser retirado da instrução switch. O mesmo pode ser feito com if...else instruções onde o otimizador pode ordenar o if...else para que o if bloco ou else seja colocado primeiro, dependendo de qual bloco é mais frequentemente verdadeiro.

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

  • Separação de código EH - Como o código EH é executado apenas excepcionalmente, muitas vezes pode ser movido para uma seção separada. Ele é movido quando otimizações guiadas por perfil podem determinar que as exceções ocorrem apenas em condições excecionais.

  • Intrínsecos de Memória - Se expandir um intrínseco ou não depende de se é chamado com frequência. Um intrínseco também pode ser otimizado com base no tamanho do bloco de movimentos ou cópias.

Próximos passos

Leia mais sobre essas variáveis de ambiente, funções e ferramentas que você pode usar 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 de cenários de teste. Eles agora foram preteridos e substituídos por novas opções de vinculação. Este documento mostra como mover das variáveis de ambiente para as opções do vinculador.

PgoAutoSweep
Uma função que pode ser adicionada à sua aplicação para permitir um controlo pormenorizado da captura de dados de arquivo .pgc.

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

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

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

Ver também

Ferramentas de compilação MSVC adicionais