Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Профильная оптимизация позволяет оптимизировать весь исполняемый файл, используя данные из тестовых запусков 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.