Пошаговое руководство. Использование профильной оптимизации
Обновлен: Ноябрь 2007
В данном пошаговом руководстве показано, как использовать профильную оптимизацию (PGO) в различных сценариях, начиная с простейших реализаций, использующих меню построения на базе профильной оптимизации в интегрированной среде разработки Visual Studio IDE, и заканчивая более сложными сценариями, требующими специальной настройки конфигурации. Здесь также рассматриваются дополнительные методы, позволяющие использовать программы профильной оптимизации, запускаемые из командной строки, для настройки процедур сбора и объединения данных профилирования. Общие сведения см. в разделе Профильная оптимизация.
Построение приложения с использованием профильной оптимизации
Этот пример иллюстрирует построение простого приложения с использованием профильной оптимизации.
Построение в IDE с использованием профильной оптимизации
Профильную оптимизацию можно применять к любым проектам Visual C++ в машинном коде. Следующие процедуры иллюстрируют использование профильной оптимизации для приложения Win32.
Создание проекта Win32
В меню Файл выберите Создать, а затем Проект. Откроется диалоговое окно "Создать проект"
В области Типы проектов выберите узел Visual C++, а затем в области Шаблоны выберите Проект Win32.
В поле Имя введите PGODemo.
Нажмите кнопку ОК. Откроется окно мастера приложений Win32.
Оставьте все значения параметров, предлагаемые по умолчанию. Нажмите кнопку Готово.
Построение проекта PGODemo с использованием профильной оптимизации
В панели инструментов "Стандартная" откройте список Конфигурация решения и выберите конфигурацию Release.
В окне Обозреватель решений щелкните правой кнопкой мыши узел проекта PGODemo. В контекстном меню проекта выберите пункт Оптимизация с использованием профиля и затем выберите Инструментировать.
В окне Обозреватель решений щелкните правой кнопкой мыши узел проекта PGODemo. В контекстном меню проекта выберите пункт Оптимизация с использованием профиля и затем выберите Запустить инструментированное/оптимизированное приложение для запуска приложения.
Примечание. Инструментированное приложение можно также запустить, выбрав команду Запуск или Запуск без отладки в меню Отладка.
Повторите шаг 3 для обучения инструментированного приложения с использованием различных сценариев. По завершении работы инструментированного приложения в выходном каталоге проекта создается PGC-файл, содержащий данные профиля для этого сеанса выполнения.
В окне Обозреватель решений щелкните правой кнопкой мыши узел проекта PGODemo. В контекстном меню проекта выберите пункт Оптимизация с использованием профиля и затем выберите Оптимизировать.
Построение с использованием профильной оптимизации из командной строки
Предположим, что требуется построить приложение myapp.exe из исходных файлов S1,…, Sn, используя профильную оптимизацию. На первом шаге следует обеспечить компиляцию исходных файлов S1,…, Sn с использованием параметра компилятора /GL.
Необходимо также указать параметры оптимизации, соответствующие конкретным требованиям; допустим, используется параметр /O2. Следует заметить, что построение приложения с использованием профильной оптимизации, но без параметров оптимизации (т.е. с параметром /Od), приведет к выдаче предупреждения, и компилятор автоматически переключится на построение для LTCG. На первом шаге в командной строке выполняется следующее.
Компиляция исходных файлов с параметром /GL
cl.exe /c /GL /O2 S1.cpp … Sn.cpp
link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe
На шаге 2 создается образ myapp.exe, инструментированный с помощью профильной оптимизации, а также создается файл myapp.pgd — файл базы данных профилей, который будет использоваться компилятором для построения итогового оптимизированного файла myapp.exe. По умолчанию именем PGD-файла является имя приложения, а путем — путь к выходному каталогу.
На предыдущем шаге можно использовать параметр компоновщика /pgd, чтобы изменить имя по умолчанию для PGD-файла, создаваемого для приложения. Параметр /pgd можно использовать следующим образом:
Создание инструментированного образа с использованием параметров /LTCG:PGI и /PGD
- link /ltcg:pgi /pgd:mypgd.pgd S1.obj … Sn.obj /out:myapp.exe
Теперь можно приступать к обучению инструментированного образа myapp.exe с использованием сценариев профилирования. По окончании выполнения каждого сценария создается PGC-файл.
Примечание. |
---|
Если на одном пути одновременно запустить несколько образов myapp.exe, для них всех будет создан только один PGC-файл, который записывается на диск после завершения всех экземпляров. |
Примечание. |
---|
Для PGC-файлов в качестве пути по умолчанию используется путь к исполняемому файлу. Его можно заменить, установив переменную среды VCPROFILE_PATH до запуска сценариев профилирования, т.е. задав VCPROFILE_PATH=<другой путь> и затем запустив инструментированный образ myapp.exe |
Теперь можно приступать к построению образа myapp.exe, оптимизированного с использованием профиля.
Создание оптимизированного образа с использованием параметров /LTCG:PGO и /PGD
- link /ltcg:pgo /pgd:mypgd.pgd S1.obj … Sn.obj /out:myapp.exe
Примечание. |
---|
До выполнения шага 1 необходимо поместить все PGC-файлы, созданные на этапе обучения, в ту же папку, где находится файл базы данных профилей (.PGD) |
Настройка объединения данных профиля
Предположим, что для приложения подготовлено два основных пользовательских сценария. Первый сценарий вдвое важнее (или чаще используется на практике), чем второй.
Следующая процедура показывает, как использовать среду разработки Visual Studio и программы командной строки для повышения веса данных профиля при их включении в PGD-файл.
Объединение данных профиля в среде IDE
Создание проекта Win32
В меню Файл выберите Создать, а затем Проект. Откроется диалоговое окно Создать проект.
В области Типы проектов выберите узел Visual C++, а затем в области Шаблоны выберите Проект Win32.
В поле Имя введите PGODemo.
Нажмите кнопку ОК. Откроется окно мастера приложений Win32.
Оставьте все значения параметров, предлагаемые по умолчанию. Нажмите кнопку Готово.
Построение проекта PGODemo с использованием объединенных данных профиля в среде IDE
В панели инструментов "Стандартная" откройте список "Конфигурация решения" и выберите конфигурацию Release.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт "Оптимизация с использованием профиля" в контекстном меню, а затем выберите "Инструментировать".
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт "Оптимизация с использованием профиля" в контекстном меню, а затем выберите "Выполнить инструментированное приложение". В результате будет запущено приложение. Инструментированное приложение можно также запустить, выбрав команду "Запуск" или "Запуск без отладки" в меню "Отладка", как обычно.
Повторите шаг 3 дважды, по одному разу для каждого пользовательского сценария. В результате в выходном каталоге будут созданы два PGC-файла: PGODemo!1.pgc и PGODemo!2.pgc.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите команду "Свойства"; откроется диалоговое окно свойств PGODemo.
На вкладке Свойства конфигурации выберите События построения и затем щелкните Событие перед компоновкой. В поле Командная строка введите следующую команду:
"$(VCInstallDir)bin\pgomgr.exe" -merge:2 $(OutDir)\$(ProjectName)!1.pgc $(OutDir)\$(ProjectName).pgd
Примечание. На этом шаге с помощью программы pgomgr.exe выполняется объединение файла PGODemo!1.pgc отдельным действием перед запуском компоновщика для построения итогового оптимизированного приложения. Компоновщик вызовет программу pgomgr.exe снова на следующем шаге для объединения файла PGODemo!2.pgc, но с весом по умолчанию, равным 1.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт Оптимизация с использованием профиля в контекстном меню и затем выберите Оптимизировать.
Объединение данных профиля из командной строки
Для настройки объединения данных профиля можно использовать командную строку.
Построение объединенных данных профиля из командной строки
cl.exe /c /GL /O2 S1.cpp … Sn.cpp
link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe
В результате двух предыдущих шагов создается инструментированный файл myapp.exe.
После обучения инструментированного файла myapp.exe с использованием двух разных сценариев создаются два разных PGC-файла: myapp!1.pgc и myapp!2.pgc.
Назначьте первому сценарию больший вес с помощью программы pgomgr.exe:
Pgomgr –merge:2 myapp!1.pgc myapp.pgd
Создайте итоговое оптимизированное приложение с помощью команды link:
link /ltcg:pgo /pgd:myapp.pgd /out:myapp.exe
В результате выполняется объединение файла myapp!2.pgc с весом по умолчанию 1.
Обновление профильной оптимизации
В двух предыдущих сценариях использовался параметр компоновщика /ltcg:pgo для построения итогового оптимизированного приложения после построения и обучения инструментированного образа. При задании параметра /ltcg:pgo компоновщик выполняет ряд проверок, чтобы убедиться в отсутствии изменений во входных файлах (объектных файлах, библиотеках и т. п.), использованных для построения инструментированного приложения. Иными словами, для использования параметра /ltcg:pgo необходимо, чтобы все входные файлы, переданные в компоновщик, были теми же, что и файлы, переданные на шаге /ltcg:pgi.
Дело в том, что изменения, случайно внесенные в исходные коды после построения инструментированного приложения и PGD-файла, могут существенно повлиять на генерацию кода профильной оптимизации и на решения, принимаемые в ходе оптимизации.
Предположим, что после построения инструментированного приложения, создания данных профиля и построения приложения на базе профильной оптимизации выясняется, что вы забыли обновить номер версии приложения или обнаружили небольшую ошибку, требующую минимальных исправлений, которые серьезно не повлияют на поток обработки в приложении. Для такого сценария предусмотрен параметр /ltcg:pgu. При его использовании компоновщик не будет выполнять проверки, инициируемые параметром /ltcg:pgo. В промежутке между построениями PGI и PGU можно изменять и повторно компилировать файлы приложения, и даже добавлять новые файлы.
В следующей процедуре показано, как использовать параметр /ltcg:pgu в среде разработки Visual Studio и в программах командной строки.
Обновление в среде IDE
Построение PGODemo с использованием параметра /LTCG:PGU в IDE
В панели инструментов "Стандартная" откройте список "Конфигурация решения" и выберите конфигурацию Release.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт Оптимизация с использованием профиля в контекстном меню, а затем выберите Инструментировать.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт Оптимизация с использованием профиля в контекстном меню, и затем выберите Запустить инструментированное/оптимизированное приложение. В результате будет запущено приложение. Инструментированное приложение можно также запустить, выбрав команду Начать отладку или Запуск без отладки в меню Отладка, как обычно.
На этом шаге в любой исходный файл можно внести любые изменения. Как упоминалось выше, изменения, существенно затрагивающие приложение, могут привести к серьезному снижению производительности. Обычно речь может идти о самых незначительных изменениях, например исправлении мелких ошибок или изменении файлов ресурсов.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт Оптимизация с использованием профиля в контекстном меню, и затем выберите Обновить. В результате будет выполнена повторная компиляция только измененных файлов и затем запущен компоновщик с параметром /ltcg:pgu вместо /ltcg:pgo, чтобы разрешить правку файлов.
Примечание. Будут выданы предупреждения о каждой новой функции, для которой отсутствуют данные профиля, и о каждой измененной функции, для которой данные профиля, собранные на этапе обучения, стали недействительными. В панели инструментов "Стандартная" откройте список "Конфигурация решения" и выберите конфигурацию Release.
Примечание. Если на шаге 5 в окне Обозреватель решений щелкнуть правой кнопкой мыши измененный исходный файл и выбрать Компилировать, это приведет к удалению из выходной папки всех файлов, связанных с профильной оптимизацией, поскольку система управления проектами выполняет построение с очисткой при переходе от построения на базе профильной оптимизации к обычному построению.
Обновление из командной строки
Для обновления профильной оптимизации можно использовать программы командной строки.
Построение с использованием /LTCG:PGU в командной строке
cl.exe /c /GL /O2 S1.cpp … Sn.cpp
link /ltcg:pgi S1.obj … Sn.obj /out:myapp.exe
В результате двух предыдущих шагов создается инструментированный файл myapp.exe.
Выполните обучение инструментированного приложения myapp.exe.
link /ltcg:pgo /pgd:myapp.pgd /out:myapp.exe
На шаге 4 создается оптимизированное приложение myapp.exe. Предположим, что в файле Sm.cpp обнаружена небольшая ошибка; можно внести в него исправления и скомпилировать только файл Sm.cpp:
cl /c /GL /O2 Sm.cpp
Затем используйте параметр /ltcg:pgu для построения оптимизированного приложения на основе прежних данных профиля, созданных на шаге 3.
link /ltcg:pgu /pgd:myapp.pgd /out:myapp.exe
Настройка конфигураций профильной оптимизации
В этом сценарии демонстрируется создание настраиваемых конфигураций профильной оптимизации для построения решений с несколькими проектами. В этом сценарии в решение добавляется библиотека DLL, связываемая с приложением PGODemo. Создаются две конфигурации: PGIRelease и PGORelease, которые используются для построения всего решения, — вместо построения каждого продукта по отдельности с помощью команд меню профильной оптимизации.
Создание настраиваемых конфигураций профильной оптимизации
В меню Файл выберите Создать, а затем Проект. Откроется диалоговое окно Создать проект.
В области Типы проектов выберите узел Visual C++, а затем в области Шаблоны выберите Проект Win32.
В поле Имя введите PGODemo.
Нажмите кнопку ОК. Откроется окно Мастер приложений Win32.
Оставьте все значения параметров, предлагаемые по умолчанию. Нажмите кнопку Готово.
Будет создано решение и проект PGODemo. Теперь создайте проект DLL.
В окне Обозреватель решений щелкните решение правой кнопкой мыши и выберите Добавить. Затем выберите Новый проект. Откроется диалоговое окно Создать проект.
В области Типы проектов выберите узел Visual C++, а затем в области Шаблоны выберите Проект Win32.
В поле Имя введите PGODemoDLL.
Нажмите кнопку ОК. Откроется окно мастера приложений Win32.
На странице Параметры приложения выберите Тип приложения DLL и нажмите кнопку Готово.
В результате создается DLL-проект с именем PGODemoDLL.
В окне Обозреватель решений дважды щелкните проект PGODemoDLL, дважды щелкните файл PGODemoDLL.cpp и добавьте следующий код:
__declspec(dllexport) void HelloMessage(void) { MessageBox(NULL, L"hello", L"PGODemoDLL", MB_OK); }
В окне Обозреватель решений дважды щелкните проект PGODemo, дважды щелкните файл PGODemo.cpp и добавьте следующее объявление перед определением функции _tWinMain:
__declspec(dllimport) void HelloMessage(void);
В функции _tWinMain перед основным циклом сообщения добавьте следующий код:
HelloMessage();
В окне Обозреватель решенийщелкните правой кнопкой мыши решение PDODemo и выберите команду Зависимости проектов. Откроется диалоговое окно Зависимости проектов.
На странице "Зависимости" выберите PGODemo в списке Проекты. Отметьте PGODemoDLL флажком в списке Зависит от.
Затем создайте конфигурации PGIRelease и PGORelease.
В окне Обозреватель решений щелкните решение правой кнопкой мыши и выберите команду Диспетчер конфигураций. Откройте список Конфигурация для проекта PGODemo и выберите <Создать...>. Откроется диалоговое окно "Создание конфигурации проекта".
В поле "Имя конфигурации проекта" введите PGIRelease и затем выберите Release в списке Копировать параметры из. Убедитесь, что флажок Создать новые конфигурации решения установлен.
Повторите этот шаг для проекта PGODemoDLL, чтобы добавить в него конфигурацию PGIRelease. Убедитесь, что на этот раз флажок Создать новые конфигурации решения снят.
Повторите шаг 16 для обоих проектов, чтобы создать конфигурацию PGORelease. Убедитесь, что при этом копируются параметры из конфигурации Release. Закройте диалоговое окно Диспетчер конфигураций.
Итак, созданы две конфигурации: PGIRelease и PGORelease.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo и выберите команду Свойства. В списке Конфигурация выберите конфигурацию PGIRelease. На странице Свойства конфигурации выберите Общие. Откройте список Оптимизация всей программы и выберите Ведомая профилем оптимизация – инструмент. Для сохранения изменений нажмите кнопку Применить.
В списке Конфигурация выберите конфигурацию PGORelease. На странице Свойства конфигурации выберите Общие. Откройте список Оптимизация всей программы и выберите Ведомая профилем оптимизация – оптимизация. Для сохранения изменений нажмите кнопку Применить.
Повторите шаги 18 и 19 для конфигураций PGIRelease и PGORelease проекта PGODemoDLL.
Теперь изменим Промежуточный каталог для конфигурации PGORelease, чтобы он совпадал с каталогом Выходные данные для конфигурации PGIRelease в обоих проектах.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo и выберите команду Свойства. В списке Конфигурация выберите конфигурацию PGORelease. На странице Свойства конфигурации выберите "Общие". В поле Промежуточный каталог введите $(SolutionDir)PGIRelease. Нажмите кнопку Применить и закройте диалоговое окно.
Повторите шаг 21 для проекта PGODemoDLL.
Теперь добавим путь к PGODemoDLL.dll в переменную среды для пути приложения PGODemo.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo и выберите команду Свойства. В списке Конфигурация выберите конфигурацию PGIRelease. На странице Свойства конфигурации выберите Отладка. В поле Среда введите следующее значение, после чего нажмите кнопку Применить:
path=%path%;$(SolutionDir)PGODemoDLL\PGIRelease
В списке Конфигурация выберите конфигурацию PGORelease. На странице Свойства конфигурации выберите Отладка. В поле Среда введите следующее:
path=%path%;$(SolutionDir)PGODemoDLL\PGORelease
Нажмите кнопку Применить, а затем кнопку ОК, чтобы закрыть диалоговое окно.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo и выберите команду Свойства. В списке Конфигурация выберите конфигурацию PGORelease. На странице Свойства конфигурации выберите Компоновщик и затем выберите Оптимизация. В поле База данных для оптимизации с помощью профиля замените $(TargetDir) значением $(IntDir)\.
Повторите этот шаг для проекта PGODemoDLL.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemoDLL и выберите команду Свойства. В списке Конфигурация выберите конфигурацию PGORelease. На странице Свойства конфигурации выберите Компоновщик и затем Дополнительно. В поле Библиотека импорта замените $(TargetDir) значением $(IntDir)\.
В панели инструментов "Стандартная" откройте список Конфигурация решения и выберите конфигурацию PGIRelease. В окне Обозреватель решений щелкните решение правой кнопкой мыши и выберите Построить решение.
В результате будут созданы инструментированные приложения для обоих проектов.
Выберите в меню Отладка команду Начать отладку или Запуск без отладки. Будет запущено приложение PGODemo. После завершения его работы будут созданы два PGC-файла, один для выходной папки PGODemo\PGIRelease и другой для PGODemoDLL\PGIRelease.
В панели инструментов "Стандартная » откройте список Конфигурации решения и выберите решение PGORelease. В окне Обозреватель решений щелкните решение правой кнопкой мыши и выберите Построить решение.
Теперь для обоих проектов в папках конфигураций PGORelease созданы образы, оптимизированные с использованием профиля.
Настройка сбора данных профиля
По умолчанию сбор данных профиля означает сохранение всех данных, описывающих поведение инструментированного приложения с момента его запуска до завершения работы. Средства профильной оптимизации включают программу PGOSWEEP, позволяющую настраивать процесс сбора данных профиля. С помощью PGOSWEEP можно собирать данные профиля за определенный период в течение выполнения сценария профилирования.
В следующей процедуре показано, как управлять сбором данных профиля в среде разработки Visual Studio и с помощью программ командной строки.
Создание проекта Win32
В меню Файл выберите Создать, а затем Проект. Откроется диалоговое окно Создать проект.
В области Типы проектов выберите узел Проекты Visual C++, а затем в области Шаблоны выберите Проект Win32.
В поле "Имя" введите PGODemo.
Нажмите кнопку ОК. Откроется окно Мастер приложений Win32.
Оставьте все значения параметров, предлагаемые по умолчанию. Нажмите кнопку Готово.
Построение инструментированного проекта PGODemo в среде IDE
В панели инструментов "Стандартная" откройте список Конфигурация решения и выберите конфигурацию Release.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт Оптимизация с использованием профиля в контекстном меню и затем выберите Инструментировать.
В окне Обозреватель решений щелкните правой кнопкой мыши проект PGODemo. Выберите пункт Оптимизация с использованием профиля в контекстном меню, и затем выберите Запустить инструментированное/оптимизированное приложение. В результате будет запущено приложение. Инструментированное приложение можно также запустить, выбрав команду Начать отладку или Запуск без отладки в меню Отладка, как обычно.
В меню Сервис выберите пункт Внешние инструменты. Откроется диалоговое окно Внешние инструменты. Нажмите кнопку Добавить. В поле Название введите Pgosweep. Нажмите кнопку Обзор рядом с полем Команда и найдите путь к программе PGOSWEEP. Программа PGOSWEEP должна быть установлена в папке ...\VC\bin в каталоге установки Visual Studio. Установите флажок Запросить аргументы и нажмите кнопку ОК, чтобы закрыть диалоговое окно Внешние инструменты.
В меню Сервис выберите пункт Pgosweep. Появится диалоговое окно. В поле Аргументы введите:
$(TargetPath) $(TargetDir)$(TargetName)_custom!1.pgc
и нажмите кнопку ОК.
В главном окне PGODemo выберите в меню Файл команду Выход, чтобы закончить сбор данных профиля.
Теперь в каталоге $(OutDir) имеется два PGC-файла. Файл PGODemo_custom!1.pgc создан программой PGOSWEEP и содержит данные профиля, собранные с момента запуска профилирования до вызова PGOSWEEP. Второй файл, получивший по умолчанию имя PGODemo!1.pgc, содержит данные профиля, собранные с момента завершения вычистки до завершения работы инструментированного приложения.
Важно отметить, что при построении оптимизированного образа автоматически объединяются только PGC-файлы со стандартными именами $(ProjectName)!n.PGC, где n — порядковый номер. Для объединения файла PGODemo_custom!1.pgc, созданного на предыдущем шаге, необходимо добавить шаг настраиваемого объединения (см. описанный выше сценарий "Настройка объединения данных профиля").
Эти действия позволяют контролировать сбор данных профиля и тем самым оптимизировать приложение исходя из того, какие его компоненты наиболее важны на этапе выполнения.
Сбор данных профиля из командной строки
Для настройки сбора данных профиля можно использовать программы командной строки.
Построение объединенных данных профиля из командной строки
Создайте инструментированный исполняемый файл:
cl.exe /c /GL /O2 S1.cpp Sn.cpp link /ltcg:pgi S1.obj Sn.obj /out:myapp.exe
Запустите инструментированное приложение myapp.exe и в нужный момент выполните сбор данных с помощью программы Pgosweep:
Pgosweep myapp.exe mycustomdata.pgc
Примечание. PGC-файлы, имена которых не соответствуют стандартному формату, необходимо будет объединить вручную с помощью программы Pgomgr.
После завершения работы myapp.exe автоматически создается еще один PGC-файл (myapp!1.pgc). Не забудьте удалить его или переместить за пределы рабочего каталога компоновщика, прежде чем запускать компоновщик для построения оптимизированного приложения myapp.exe, если этот файл не предполагается использовать как часть данных профиля.
Объедините файл mycustomdata.pgc с помощью Pgomgr:
Pgomgr –merge mycustomdata.pgc myapp.pgd
Используйте команду link для создания итогового оптимизированного приложения:
link /ltcg:pgo /pgd:myapp
Настраиваемый сбор данных профиля с использованием PgoAutoSweep
Вызвав из приложения программу PgoAutoSweep, можно сохранить и сбросить данные профиля в любой момент на этапе выполнения. Следующий пример иллюстрирует работу этой программы.
В этом примере создаются два PGC-файла. Первый содержит данные, описывающие поведение среды выполнения до того, как счетчик примет значение 3, а второй — данные, собранные с этого момента до прекращения работы приложения.
#include <stdio.h>
#include <windows.h>
#include <pgobootrun.h>
int count = 10;
int g = 0;
void func2(void)
{
printf("hello from func2 %d\n", count);
Sleep(2000);
}
void func1(void)
{
printf("hello from func1 %d\n", count);
Sleep(2000);
}
void main(void)
{
while (count--)
{
if(g)
func2();
else
func1();
if (count == 3)
{
PgoAutoSweep("func1");
g = 1;
}
}
PgoAutoSweep("func2");
}