Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Профильная оптимизация позволяет оптимизировать весь исполняемый файл, используя данные из тестовых запусков EXE- или DLL-файла. Данные представляют вероятную производительность программы в рабочей среде.
Оптимизация с помощью профилей доступна только для собственных целевых объектов x86, x64 или ARM64. Оптимизации на основе профилирования недоступны для исполняемых файлов, которые выполняются в общей исполнительной среде. Даже если создать сборку со смешанным машинным и управляемым кодом (с помощью параметра компилятора /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 являются файлами двоичного типа. При хранении в системе управления версиями избегайте любых возможных автоматических преобразований текстовых файлов.
Оптимизации, выполняемые PGO
Профильная оптимизация включает в себя перечисленные ниже проверки и улучшения.
Встраивание — например, если функция 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.