Измерение производительности приложения посредством анализа использования ЦП (C#, Visual Basic, C++, F#)
Средство диагностики Использование ЦП, интегрированное в отладчик, позволяет находить проблемы с производительностью во время отладки. Анализировать загрузку ЦП также можно без подключения отладчика — нужно просто указать выполняющееся приложение. Дополнительные сведения см. в разделе Запуск средств профилирования с отладчиком или без него.
При приостановке отладчика средство Загрузка ЦП в окне "Средства диагностики" собирает сведения о функциях, которые выполняются в приложении. Кроме того, это средство перечисляет функции, которые выполняли максимальный объем работы, а также предоставляет график временной шкалы, который позволяет сосредоточить внимание на определенных сегментах сеанса выборки.
Важно!
Средства диагностики, интегрированные в отладчик, поддерживаются для разработки приложений .NET в Visual Studio, включая ASP.NET и ASP.NET Core, и машинного кода или кода C++. Требуется соответствующая рабочая нагрузка Visual Studio. Для запуска средств профилирования с отладчиком (окно Средства диагностики) требуется Windows 8 и более поздние версии.
При работе с этим руководством вы сделаете следующее:
- Сбор данных об использовании ЦП
- Анализ данных о загрузке ЦП
Если средство Загрузка ЦП не предоставляет необходимые данные, можно воспользоваться другими средствами профилирования в Профилировщике производительности, предоставляющими другие виды информации, которая может оказаться полезной. Как правило, проблемы производительности приложения могут вызываться другими компонентами помимо ЦП, такими как память, отрисовка пользовательского интерфейса или время запроса сети.
Шаг 1. Сбор данных о загрузке ЦП
Откройте проект для отладки в Visual Studio и установите точку останова в приложении в точке, где вы хотите проверить загрузку ЦП.
Установите вторую точку останова в конце функции или области кода, который требуется проанализировать.
С помощью двух точек останова можно ограничить сбор данных частями кода, которые требуется проанализировать.
Окно Средства диагностики появится автоматически, если вы не отключали эту функцию. Чтобы снова открыть окно, щелкните Отладка>Окна>Показать средства диагностики.
Вы можете выбрать, что следует просмотреть, Использование памяти или Загрузка ЦП (либо оба средства), с помощью параметра Выбор средств на панели инструментов. В Visual Studio Enterprise также можно включить или отключить IntelliTrace, выбрав Сервис>Параметры>IntelliTrace.
Нас главным образом интересует загрузка ЦП, поэтому убедитесь, что средство Загрузка ЦП включено (оно включено по умолчанию).
Щелкните Отладка>Начать отладку (Запустить на панели инструментов или F5).
По завершении загрузки приложения отображается представление Сводка Средств диагностики. Если вам нужно открыть окно, щелкните Отладка>Окна>Показать средства диагностики.
Дополнительные сведения о событиях см. в разделе Поиск и фильтрация на вкладке "События" окна "Средства диагностики".
Запустите сценарий, который вызвал срабатывание первой точки останова.
Приостановив отладчик, включите сбор данных о загрузке ЦП, а затем откройте вкладку Загрузка ЦП.
При выборе пункта Запись профиля ЦП Visual Studio начнет записывать функции и сведения о времени их выполнения. Эти собранные данные можно просматривать только в том случае, если приложение останавливается в точке останова.
Нажмите клавишу F5, чтобы запустить приложение до второй точки останова.
Теперь у вас есть данные о производительности приложения именно для той области кода, которая выполняется между двумя точками останова.
Профилировщик начинает подготавливать данные потока. Дождитесь завершения этой операции.
Средство "Загрузка ЦП" выведет отчет на вкладке Загрузка ЦП.
Если вы хотите выбрать для анализа более конкретную область кода, выберите область на временной шкале ЦП (это должна быть область, в которой отображаются данные профилирования).
На этом этапе можно начать анализировать данные. Если у вас возникли проблемы с сбором или отображением данных, см . статью "Устранение ошибок профилирования" и устранение проблем.
Совет
При определении проблем с производительностью рекомендуется сделать несколько измерений. Вполне естественно, что производительность варьируется от запуска к запуску, а первое выполнение путей кода обычно происходит медленнее, так как необходимо разово провести такие действия по инициализации, как загрузка библиотек DLL, JIT-компиляция методов и инициализация кэшей. Сделав несколько измерений, вы сможете лучше понять диапазон и медиану отображаемой метрики и сравнить показатель первого выполнения со стабильной производительностью области кода.
Шаг 2. Анализ данных о загрузке ЦП
Мы рекомендуем начать анализ данных с проверки списка функций на вкладке "Загрузка ЦП" и выявления функций, выполняющих основную часть работы, а затем подробно рассмотреть каждую из этих функций.
В списке функций изучите функции, которые выполняют большую часть работы.
Совет
Функции перечисляются, начиная с тех, которые выполняют большую часть работы (а не в порядке вызова). Это позволяет быстро находить функции, которые выполнялись дольше всего.
В списке функций дважды щелкните одну из функций вашего приложения, которая выполняет много работы.
При двойном щелчке функции представление "Функции " открывается на левой панели. Выберите представление caller/Callee в раскрывающемся меню.
В этом представлении выбранная функция отображается в заголовке и в поле "Текущая функция" (DoWork, в этом примере). Функция, вызывавшая текущую функцию, отображается в левой части окна в разделе Вызывающие функции, а все функции, вызываемые текущей функцией, отображаются в поле Вызываемые функции справа. (Можно выбрать любое поле, чтобы изменить текущую функцию.)
В этом представлении показано общее время (мс) и доля общего времени выполнения приложения, затраченного на выполнение функции. В поле Тело функции также показан общий объем времени (и доля времени), затраченного в теле функции за исключением времени, затраченного в вызываемых и вызывающих функциях.
При двойном щелчке функции в левой панели откроется представление Вызывающий/вызываемый.
В этом представлении выбранная функции отображается в заголовке и в поле Текущая функция (в этом примере GetNumber). Функция, вызывавшая текущую функцию, отображается в левой части окна в разделе Вызывающие функции, а все функции, вызываемые текущей функцией, отображаются в поле Вызываемые функции справа. (Можно выбрать любое поле, чтобы изменить текущую функцию.)
В этом представлении показано общее время (мс) и доля общего времени выполнения приложения, затраченного на выполнение функции. В поле Тело функции также показан общий объем времени (и доля времени), затраченного в теле функции за исключением времени, затраченного в вызываемых и вызывающих функциях. (В этом примере в теле функции затрачено 2367 из 2389 мс, а оставшиеся 22 мс затрачены во внешнем коде, вызванном этой функцией).
Совет
Высокие значения в поле Тело функции могут свидетельствовать о проблемах производительности внутри самой функции.
Чтобы увидеть более обобщенное представление, показывающее порядок, в котором вызываются функции, выберите в раскрывающемся списке в верхней части панели пункт Дерево вызовов.
Каждая нумерованная область на рисунке соответствует определенному шагу в процедуре.
Изображения Description Узел верхнего уровня в деревьях вызовов для использования ЦП представляет собой псевдоузел В большинстве приложений при отключенном параметре Показать внешний код узлом второго уровня является узел [Внешний код] , который содержит код системы и инфраструктуры, запускающий и останавливающий приложение, отрисовывающий пользовательский интерфейс, управляющий планированием потоков и предоставляющий приложению другие низкоуровневые службы. Дочерними элементами узла второго уровня являются методы пользовательского кода и асинхронные подпрограммы, которые вызываются или создаются кодом системы и инфраструктуры на втором уровне. Дочерние узлы метода содержат данные только для вызова родительского метода. Если параметр Показать внешний код отключен, методы приложения также могут содержать узел [Внешний код] . Ниже приведены дополнительные сведения по значениям столбца.
Значение Общее время ЦП указывает, какой объем работы был выполнен некоторой функцией и всеми вызванными ей функциями. Высокие значения общего времени ЦП указывают на функции, которые в целом являются наиболее ресурсоемкими.
Значение Собственное время указывает, какой объем работы был выполнен кодом в теле функции, за исключением работы, выполненной вызванными ей функциями. Высокие значения собственного времени ЦП могут свидетельствовать о проблемах производительности внутри самой функции.
Модули. Имя модуля, содержащего функцию, или количество модулей, содержащих функции в узле [Внешний код].
Чтобы увидеть вызовы функций, которые используют самый высокий процент ЦП в представлении дерева вызовов, нажмите Развернуть критический путь.
Примечание.
Если код отображается в дереве вызовов с пометкой "broken" (неработающий) или "unwalkable stack" (нетрассируемый стек), это указывает, что трассировка событий Windows, скорее всего, прервана. Для устранения проблемы попробуйте повторно выполнить ту же трассировку.
Просмотр внешнего кода
Внешний код — это функции в компонентах системы и платформы, которые исполняются вашим кодом. Внешний код включает функции, которые запускают и останавливают приложение, отрисовывают пользовательский интерфейс, управляют потоками и предоставляют приложению другие низкоуровневые службы. В большинстве случаев внешний код вас интересовать не будет, поэтому средство "Загрузка ЦП" собирает внешние функции пользовательского метода в один узел [Внешний код].
Если вы захотите посмотреть пути к вызовам внешнего кода, выберите Показать внешний код в списке Представление фильтра и выберите Применить.
Помните о том, что многие цепочки вызовов имеют глубокий уровень вложенности, поэтому ширина столбца "Имя функции" может превышать ширину многих мониторов. В этом случае имена функций отображаются в виде […].
Используйте поле поиска, чтобы найти требуемый узел, а затем воспользуйтесь горизонтальной полосой прокрутки для отображения данных в представлении.
Совет
Если вы выполняете профилирование внешнего кода, вызывающего функции Windows, следует убедиться, что используются самые новые версии PDB-файлов. Без этих файлов имена функций Windows в представлениях отчетов будут отображаться в непонятном или трудном для понимания виде. Дополнительные сведения о том, как убедиться в наличии нужных файлов, см. в статье Указание файлов символов (.pdb) и файлов с исходным кодом в отладчике Visual Studio.
Следующие шаги
В этом руководстве вы узнали, как собирать и анализировать данные об использовании ЦП. Если вы уже завершили обзор профилировщика, вам может потребоваться ознакомиться с общим подходом к оптимизации кода с помощью средств профилирования.
В этом руководстве вы узнали, как собирать и анализировать данные об использовании ЦП во время отладки. Вы можете узнать больше о сборках выпуска профилирования с помощью профилировщика производительности.