Поделиться через


PgoAutoSweep

PgoAutoSweep сохраняет текущие сведения счетчиков профиля в файл, а затем сбрасывает эти счетчики. Эта функция применяется при обучении профильной оптимизации для записи всех данных профиля из выполняющейся программы в файл .pgc, который в дальнейшем будет использоваться в оптимизационной сборке.

Синтаксис

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

Параметры

name
Строка идентификации для сохраненного файла .pgc.

Замечания

Функцию PgoAutoSweep можно вызывать из приложения, чтобы сохранить и сбросить данные профиля в любой момент во время выполнения приложения. В инструментированной сборке PgoAutoSweep записывает текущие данные профилирования, сохраняет их в файле и сбрасывает счетчики профиля. Это работает аналогично вызову команды pgosweep в конкретной точке исполняемого файла. В оптимизированной сборке PgoAutoSweep не работает.

Сохраненные данные счетчиков профиля помещаются в файл с именем базовое_имя-имя!значение.pgc, где базовое_имя — это базовое имя исполняемого файла, имя — параметр, переданный в PgoAutoSweep, и значение — уникальное значение, обычно монотонно увеличивающееся число, для предотвращения конфликтов имен файлов.

Чтобы использовать файл .pgc, созданный функцией PgoAutoSweep для создания оптимизированного исполняемого файла, его необходимо объединить с файлом .pgd. Такое слияние можно выполнить с помощью команды pgomgr.

Имя объединенного файла .pgd можно передать компоновщику во время оптимизационной сборки с помощью аргумента PGD=имя_файла в параметре компоновщика /USEPROFILE или с помощью нерекомендуемого параметра компоновщика /PGD. При объединении файлов .pgc в файл с именем базовое_имя.pgd не нужно указывать имя файла в командной строке, так как компоновщик выбирает его по умолчанию.

Функция PgoAutoSweep поддерживает параметр потокобезопасности, заданный при создании инструментированной сборки. Если вы используете параметр по умолчанию или задаете аргумент NOEXACT в параметре компоновщика /GENPROFILE или /FASTGENPROFILE, вызовы функции PgoAutoSweep не являются потокобезопасными. При использовании аргумента EXACT создается потокобезопасный и более точный, но и более медленный инструментированный исполняемый файл.

Требования

Маршрут Обязательный заголовок
PgoAutoSweep <pgobootrun.h>

Исполняемый файл должен включать файл pgobootrun.lib в скомпонованных библиотеках. Этот файл входит в установку Visual Studio и находится в каталоге библиотек VC для каждой поддерживаемой архитектуры.

Пример

В приведенном ниже примере функция PgoAutoSweep используется для создания двух файлов .pgc в разных точках во время выполнения. Первый файл содержит данные, описывающие поведение среды выполнения, пока значение count не достигло 3, а второй файл содержит данные, собранные после этой точки и до завершения приложения.

// 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");
}

В командной строке разработчика скомпилируйте код в объектный файл с помощью следующей команды:

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

Затем создайте инструментированную сборку для обучения с помощью следующей команды:

link /LTCG /genprofile pgobootrun.lib pgoautosweep.obj

Запустите инструментированный исполняемый файл для записи данных для обучения. Выходные данные, полученные в результате вызовов функции PgoAutoSweep, сохраняются в файлах с именами pgoautosweep-func1!1.pgc и pgoautosweep-func2!1.pgc. Выходные данные программы должны выглядеть следующим образом:

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

Объедините сохраненные данные в базу данных обучения профиля, выполнив команду pgomgr:

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

Результат выполнения этой команды выглядит следующим образом:

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.

Теперь вы можете использовать эти данные для обучения, чтобы создать оптимизированную сборку. Чтобы создать оптимизированный исполняемый файл, введите следующую команду:

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

См. также

Профильная оптимизация
pgosweep