Профильная оптимизация
Профильная оптимизация позволяет оптимизировать весь исполняемый файл, используя данные из тестовых запусков EXE- или DLL-файла. Данные представляют вероятную производительность программы в рабочей среде.
Оптимизация с помощью профилей доступна только для собственных целевых объектов x86, x64 или ARM64. Они недоступны для исполняемых файлов, которые будут запускаться в среде CLR. Даже если создать сборку со смешанным машинным и управляемым кодом (с помощью параметра компилятора /clr), невозможно использовать профильную оптимизацию только для машинного кода. Попытка выполнить сборку проекта с этими параметрами, заданными в интегрированной среде разработки, приведет к ошибке сборки.
Примечание.
Сведения, полученные из теста профилирования, запускают переопределения оптимизаций, которые в противном случае вступят в силу, если указать /Ob, /Os или /Ot. Дополнительные сведения см. в статьях Параметр /Ob (расширение встраиваемых функций) и /Os, /Ot (приоритет размера кода или скорости кода).
Действия по оптимизации приложения
При использовании профильной оптимизации выполните указанные ниже действия, чтобы оптимизировать приложение.
Скомпилируйте один или несколько файлов исходного кода с параметром /GL.
Каждый модуль, собранный с параметром /GL, может быть проанализирован во время тестовых запусков профильной оптимизации для получения информации о поведении во время выполнения. Не каждый модуль в сборке профильной оптимизации требуется компилировать с параметром /GL. Однако только модули, скомпилированные с использованием /GL, будут обработаны и доступны позднее для профильной оптимизации.
Выполните компоновку с использованием /LTCG и /GENPROFILE или /FASTGENPROFILE.
Если использовать одновременно и параметр /LTCG, и параметр /GENPROFILE или /FASTGENPROFILE, при запуске инструментированного приложения будет создан файл
.pgd
. После добавления данных тестового запуска в файл.pgd
они могут использоваться как входные данные для следующего этапа компоновки (создание оптимизированного образа). При указании параметра /GENPROFILE можно также добавить аргумент PGD=имя_файла, чтобы указать нестандартное имя или расположение для файла.pgd
. Сочетание параметров компоновщика /LTCG и /GENPROFILE или /FASTGENPROFILE заменяет нерекомендуемый параметр компоновщика /LTCG:PGINSTRUMENT.Профилирование приложения.
Каждый раз, когда профилируемый сеанс EXE или профилируемый DLL-файл выгружается, создается файл
appname!N.pgc
. Файл.pgc
содержит сведения об определенном тестовом запуске приложения. appname — это имя приложения, а N — это номер, начиная с 1, который увеличивается в зависимости от числа других файловappname!N.pgc
в каталоге. Можно удалить файл.pgc
, если тестовый запуск не представляет сценарий, который вы хотите оптимизировать.Во время тестового запуска можно принудительно закрыть открытый в текущий момент файл
.pgc
и создать новый файл.pgc
с помощью служебной программы pgosweep (например, если конец тестового сценария не совпадает с завершением работы приложения).Приложение также может напрямую вызывать функцию PGO PgoAutoSweep для записи данных профиля в момент вызова в файл
.pgc
. Она обеспечивает более точный контроль над кодом, охватываемым записанными данными в файлах.pgc
. Пример использования этой функции см. в документации по PgoAutoSweep.При создании инструментированной сборки сбор данных по умолчанию осуществляется в непотокобезопасном режиме, который обеспечивает более высокую скорость, но, возможно, в ущерб точности. С помощью аргумента EXACT для /GENPROFILE или /FASTGENPROFILE можно настроить сбор данных в потокобезопасном режиме, который точнее, но медленнее. Этот параметр также доступен, если вы задаете нерекомендуемую переменную среды PogoSafeMode или нерекомендуемый параметр компоновщика /POGOSAFEMODE при создании инструментированной сборки.
Выполните компоновку с использованием /LTCG и /USEPROFILE.
Для создания оптимизированного образа используйте параметры компоновщика /LTCG и /USEPROFILE. На этом шаге в качестве входных данных принимается файл
.pgd
. При указании параметра /USEPROFILE можно также добавить аргумент PGD=имя_файла, чтобы указать нестандартное имя или расположение для файла.pgd
. Это имя можно также указать с помощью нерекомендуемого параметра компоновщика /PGD. Сочетание параметров /LTCG и /USEPROFILE заменяет нерекомендуемые параметры компоновщика /LTCG:PGOPTIMIZE и /LTCG:PGUPDATE.
Можно даже создать оптимизированный исполняемый файл и позже определить, что дополнительное профилирование будет полезно для создания более оптимизированного образа. Если инструментированный образ и соответствующий файл .pgd
доступны, можно выполнить дополнительные тестовые запуски и повторно создать оптимизированный образ с новым файлом .pgd
, используя те же самые параметры компоновщика /LTCG и /USEPROFILE.
Примечание.
Файлы .pgc
и .pgd
являются файлами двоичного типа. При хранении в системе управления версиями избегайте любых возможных автоматических преобразований текстовых файлов.
Оптимизации, выполняемые в процессе профильной оптимизации
Профильная оптимизация включает в себя перечисленные ниже проверки и улучшения.
Встраивание — например, если функция A часто вызывает функцию B, а функция B относительно небольшая, то профильная оптимизация встраивает функцию B в функцию A.
Отражение виртуального вызова — если виртуальный или другой вызов через указатель функции часто предназначен для определенной функции, профильная оптимизация может вставить условно выполняемый прямой вызов функции.
Распределение регистров — оптимизация на основе данных профиля улучшает распределение регистров.
Простая блочная оптимизация — позволяет разместить часто выполняемые основные блоки, которые временно выполняются во фрейме, в одном наборе страниц (локально). Это минимизирует число используемых страниц, уменьшая тем самым затраты памяти.
Оптимизация размера и скорости — функции, на которые программа тратит больше всего времени, могут быть оптимизированы по скорости.
Структура функции — на основе графа вызовов и поведения профилируемого вызываемого и вызывающего объектов функции, которые, как правило, относятся к одному пути выполнения, размещаются в одном разделе.
Оптимизация условного ветвления — с помощью зондов значений профильная оптимизация может определить, используется ли заданное значение в операторе switch чаще, чем другие значения. Затем это значение может быть извлечено из оператора switch. То же можно сделать с инструкциями
if
...else
, где оптимизатор может упорядочитьif
...else
так, чтобы блокif
илиelse
размещался первым в зависимости от того, какой блок чаще получает значение true.Отделение неиспользуемого кода — код, который не вызывается во время профилирования, перемещается в специальный раздел, добавляемый в конец набора разделов. Это позволяет вынести раздел из часто используемых страниц.
Отделение кода EH — так как код EH выполняется только в случае исключений, во многих случаях его можно поместить в отдельный раздел. Это происходит, если профильной оптимизации удается определить, что исключения возникают только при исключительных условиях.
Встроенные функции памяти — необходимость в расширении встроенной функции зависит от частоты ее вызова. Встроенная функция может также быть оптимизирована на основе размера блока перемещения или копирования.
Следующие шаги
Узнайте больше об этих переменных среды, функциях и средствах, которые можно использовать для профильной оптимизации.
Переменные среды для профильной оптимизации
Эти переменные использовались для настройки поведения сценариев тестирования во время выполнения. В настоящее время они являются нерекомендуемыми и заменены новыми параметрами компоновщика. В этом документе описывается, как перейти от использования переменных среды к использованию параметров компоновщика.
PgoAutoSweep
Функция, которую можно добавить в приложение, чтобы обеспечить детальный контроль над данными, записываемыми в файл .pgc
.
pgosweep
Программа командной строки, которая записывает все данные профиля в файл .pgc
, закрывает файл .pgc
и открывает новый файл .pgc
.
pgomgr
Программа командной строки, которая добавляет данные профиля из одного или нескольких файлов .pgc
в файл .pgd
.
Практическое руководство. Объединение нескольких профилей PGO в один профиль
Примеры использования pgomgr.