Share via


PgoAutoSweep

A PgoAutoSweep salva as informações do contador de perfil atual em um arquivo e, em seguida, redefine os contadores. Use a função durante o treinamento de otimização guiada por perfil para gravar todos os dados de perfil do programa em execução em um arquivo .pgc para uso posterior no build de otimização.

Sintaxe

void PgoAutoSweep(const char* name);    // ANSI/MBCS
void PgoAutoSweep(const wchar_t* name); // UNICODE

Parâmetros

name
Uma cadeia de caracteres de identificação para o arquivo salvo .pgc.

Comentários

Você pode chamar PgoAutoSweep em seu aplicativo para salvar e redefinir os dados de perfil a qualquer momento durante a execução do aplicativo. Em um build instrumentado, PgoAutoSweep captura os dados de criação de perfil atuais, salva-os em um arquivo e redefine os contadores de perfil. É o equivalente a chamar o comando pgosweep em um ponto específico no executável. Em um build otimizado, PgoAutoSweep é um não operacional.

Os dados salvos do contador de perfil são colocados em um arquivo chamado base_name-name!value.pgc, em que base_name é o nome de base do executável, name é o parâmetro passado para PgoAutoSweep, e value é um valor exclusivo, geralmente um número crescente de maneira monotônica, para evitar colisões de nome de arquivo.

Os arquivos .pgc criados por PgoAutoSweep devem ser mesclados em um arquivo .pgd a ser usado para criar um executável otimizado. Você pode usar o comando pgomgr para executar a mesclagem.

Você pode passar o nome do arquivo mesclado .pgd para o vinculador durante o build de otimização usando o argumento PGD=filename para a opção do vinculador /USEPROFILE ou usando a opção de vinculador /PGD preterida. Se você mesclar os arquivos .pgc em um arquivo chamado base_name.pgd, não precisará especificar o nome do arquivo na linha de comando, pois o vinculador escolherá esse nome de arquivo por padrão.

A função PgoAutoSweep mantém a configuração thread-safe especificada quando o build instrumentado é criado. Se você usar a configuração padrão ou especificar o argumento NOEXACT para a opção do vinculador /GENPROFILE ou /FASTGENPROFILE, as chamadas não PgoAutoSweep serão thread-safe. O argumento EXACT cria um executável instrumentado thread-safe e mais preciso, mas mais lento.

Requisitos

Rotina Cabeçalho necessário
PgoAutoSweep <pgobootrun.h>

O executável deve incluir o arquivo pgobootrun.lib nas bibliotecas vinculadas. Esse arquivo está incluído na instalação do Visual Studio, no diretório de bibliotecas do VC para cada arquitetura com suporte.

Exemplo

O exemplo a seguir usa PgoAutoSweep para criar dois arquivos .pgc em pontos diferentes durante a execução. O primeiro contém os dados que descrevem o comportamento do runtime até que count seja igual a 3 e o segundo contém os dados coletados após esse ponto, até pouco antes do encerramento do aplicativo.

// pgoautosweep.cpp
// Compile by using: cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp
// Link to instrument: link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj
// Run to generate data: pgoautosweep
// Merge data by using command line pgomgr tool:
// pgomgr /merge pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc pgoautosweep.pgd
// Link to optimize: link /LTCG /useprofile pgobootrun.lib pgoautosweep.obj

#include <iostream>
#include <windows.h>
#include <pgobootrun.h>

void func2(int count)
{
    std::cout << "hello from func2 " << count << std::endl;
    Sleep(2000);
}

void func1(int count)
{
    std::cout << "hello from func1 " << count << std::endl;
    Sleep(2000);
}

int main()
{
    int count = 10;
    while (count--)
    {
        if (count < 3)
            func2(count);
        else
        {
            func1(count);
            if (count == 3)
            {
                PgoAutoSweep("func1");
            }
        }
    }
    PgoAutoSweep("func2");
}

Em um prompt de comando do desenvolvedor, compile o código para um arquivo-objeto usando este comando:

cl /c /GL /W4 /EHsc /O2 pgoautosweep.cpp

Em seguida, gere um build instrumentado para treinamento usando este comando:

link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj

Execute o executável instrumentado para capturar os dados de treinamento. A saída de dados das chamadas a PgoAutoSweep são salvas em arquivos chamados pgoautosweep-func1!1.pgc e pgoautosweep-func2!1.pgc. A saída do programa deve ter esta aparência enquanto ele é executado:

hello from func1 9
hello from func1 8
hello from func1 7
hello from func1 6
hello from func1 5
hello from func1 4
hello from func1 3
hello from func2 2
hello from func2 1
hello from func2 0

Mescle os dados salvos em um banco de dados de treinamento de perfil, executando o comando pgomgr:

pgoautosweep-func1!1.pgc pgoautosweep-func2!1.pgc

A saída desse comando é semelhante ao seguinte:

Microsoft (R) Profile Guided Optimization Manager 14.13.26128.0
Copyright (C) Microsoft Corporation. All rights reserved.

Merging pgoautosweep-func1!1.pgc
pgoautosweep-func1!1.pgc: Used  3.8% (22304 / 589824) of total space reserved.  0.0% of the counts were dropped due to overflow.
Merging pgoautosweep-func2!1.pgc
pgoautosweep-func2!1.pgc: Used  3.8% (22424 / 589824) of total space reserved.  0.0% of the counts were dropped due to overflow.

Agora você pode usar esses dados de treinamento para gerar um build otimizado. Use este comando para criar o executável otimizado:

link /LTCG /useprofile pgobootrun.lib pgoautosweep.obj

Microsoft (R) Incremental Linker Version 14.13.26128.0
Copyright (C) Microsoft Corporation.  All rights reserved.

Merging pgoautosweep!1.pgc
pgoautosweep!1.pgc: Used  3.9% (22904 / 589824) of total space reserved.  0.0% of the counts were dropped due to overflow.
  Reading PGD file 1: pgoautosweep.pgd
Generating code

0 of 0 ( 0.0%) original invalid call sites were matched.
0 new call sites were added.
294 of 294 (100.00%) profiled functions will be compiled for speed
348 of 1239 inline instances were from dead/cold paths
294 of 294 functions (100.0%) were optimized using profile data
16870 of 16870 instructions (100.0%) were optimized using profile data
Finished generating code

Confira também

Otimizações guiadas por perfil
pgosweep