Поделиться через


Измерение производительности приложения путем анализа использования ЦП (C#, Visual Basic, C++, F#)

Находите проблемы с производительностью во время отладки с помощью интегрированного в отладчик средства диагностики использования ЦП. Вы также можете проанализировать использование ЦП без подключения отладчика или нацелив на работающее приложение. Дополнительные сведения см. в статье Запуск средств профилирования для сборки выпуска или отладки и анализа производительности с помощьюпрофилирования ЦП.

Когда отладчик приостанавливается, средство использования ЦП в окне средств диагностики собирает сведения о функциях, выполняемых в приложении. В средстве перечислены функции, выполняющие работу, и предоставляется график временной шкалы, который можно использовать для фокуса на определенных сегментах сеанса выборки.

Важный

Средства диагностики, интегрированные с отладчиком, поддерживаются для разработки .NET в Visual Studio, включая ASP.NET, ASP.NET Core и для разработки машинного кода или C++. Требуется соответствующая рабочая нагрузка Visual Studio . Windows 8 и более поздние версии требуются для запуска средств профилирования с помощью отладчика (окноСредства диагностики).

В этом руководстве описано следующее:

  • Сбор данных об использовании ЦП
  • Анализ данных об использовании ЦП

Шаг 1. Сбор данных об использовании ЦП

  1. Откройте проект, который нужно отлаживать в Visual Studio, и установите точку останова в приложении в точке, в которой требуется проверить использование ЦП.

  2. Задайте вторую точку останова в конце функции или области кода, которую необходимо проанализировать.

    Задав две точки останова, можно ограничить сбор данных частями кода, которые необходимо проанализировать.

  3. Окно средств диагностики отображается автоматически, если вы не отключили его. Чтобы снова открыть окно, щелкните Отладка>Windows>Показать средства диагностики.

  4. Вы можете выбрать, отображать ли использование ЦП , использование памяти или оба параметра, используя настройку «Выбор инструментов» на панели инструментов. Если вы используете Visual Studio Enterprise, вы также можете включить или отключить IntelliTrace в Tools>Options>IntelliTrace.

    снимок экрана, на котором показаны средства диагностики.

    снимок экрана, на котором показаны средства диагностики.

    Мы будем в основном рассматривать загрузку ЦПУ, поэтому убедитесь, что использование ЦПУ включено (оно включено по умолчанию).

  5. Щелкните Отладка>Начать отладку (или Запустить на панели инструментов или F5).

    Когда приложение завершит загрузку, появится представление сводки средств диагностики. Если нужно открыть окно, щелкните Отладка>Windows>Показать средства диагностики.

    снимок экрана, на котором показана вкладка

    снимок экрана, на котором показана вкладка

    Дополнительные сведения о событиях см. в разделе Поиск и фильтрация вкладки "События" окна "Средства диагностики".

  6. Запустите сценарий, который достигнет вашей первой точки останова.

  7. Пока отладчик приостановлен, включите коллекцию данных об использовании ЦП, а затем откройте вкладку использование ЦП.

    снимок экрана, на котором показаны средства диагностики, которые позволяют включить профилирование ЦП. .

    Снимок экрана, показывающий средства диагностики, которые позволяют включить профилирование ЦП.

    При выборе Запись профиля ЦПVisual Studio начнет фиксировать выполнение ваших функций и время, затрачиваемое на их выполнение. Эти собранные данные можно просматривать только при остановке приложения в точке останова.

  8. Нажмите клавишу F5, чтобы запустить приложение до второй точки останова.

    Теперь у вас есть данные о производительности приложения специально для региона кода, который выполняется между двумя точками останова.

    Профилировщик начинает подготовку данных для потока. Дождитесь завершения.

    снимок экрана на котором показаны средства диагностики для подготовки потоков.

    скриншот, на котором показаны инструменты диагностики, подготавливающие потоки.

    Инструмент контроля использования ЦП отображает отчет во вкладке использование ЦП.

    снимок экрана, на котором показана вкладка

    снимок экрана, на котором показана вкладка

  9. Если вы хотите выбрать более конкретный регион кода для анализа, выберите регион на временной шкале ЦП (это должен быть регион, в который отображаются данные профилирования).

    снимок экрана, на котором показаны средства диагностики, которые выбирают сегмент времени.

    снимок экрана, на котором показаны средства диагностики, которые выбирают сегмент времени.

    На этом этапе можно начать анализ данных. Если у вас возникли проблемы с сбором или отображением данных, ознакомьтесь с разделом об устранении ошибок профилирования и решении проблем.

    Совет

    При попытке определить проблемы с производительностью выполните несколько измерений. Производительность естественным образом варьируется от запуска к запуску, и пути кода обычно выполняются медленнее при первом запуске из-за однократной инициализации, такой как загрузка DLL-библиотек, JIT-компиляция методов и инициализация кэшей. Принимая несколько измерений, вы получите лучшее представление о диапазоне и медиане отображаемой метрики, что позволяет сравнить первый раз и стабильную производительность области кода.

Шаг 2. Анализ данных об использовании ЦП

Рекомендуется начать анализ данных, проверив список функций в разделе "Использование ЦП", определив функции, которые выполняют большую часть работы, а затем внимательно рассмотрим каждую из них.

  1. В списке функций изучите функции, выполняющие большую часть работы.

    снимок экрана, на котором показан список функций использования процессора в средствах диагностики.

    скриншот, на котором отображается список функций использования процессора в средствах диагностики.

    Совет

    Функции перечислены в порядке, начиная с тех функций, которые выполняют наибольшую часть работы, но не в порядке вызова. Это помогает быстро определить функции с наиболее длительным временем выполнения.

  2. В списке функций дважды щелкните одну из функций приложения, выполняющих большую часть работы.

    При двойном щелчке функции, в левой области откроется представление функций. Выберите caller/Callee представление в раскрывающемся меню.

    снимок экрана, на котором показано представление вызываемого абонента средств диагностики.

    В этом представлении выбранная функция отображается в заголовке и в поле Current Function (DoWork, в этом примере). Функция, вызвавшая текущую функцию, отображается слева в разделе Вызывающие функции, а все функции, вызываемые текущей функцией, отображаются в поле Вызываемые функции справа. (Можно выбрать любое поле, чтобы изменить текущую функцию.)

    В этом представлении отображается общее время (мс) и процент общего времени выполнения приложения, которое потребовалось для выполнения функции. текст функции также показывает общее время (и процент времени), затраченное на тело функции, за исключением времени, затраченного на вызовы и вызываемые функции.

    При двойном щелчке функции в левой области откроется вид CALLER/CALLEE.

    снимок экрана, на котором показано представление вызываемого абонента средств диагностики.

    В этом представлении выбранная функция отображается в заголовке и в поле Current Function (GetNumber, в этом примере). Функция, вызвавшая текущую функцию, отображается слева в разделе "Вызывающие функции", а все функции, которые вызывает текущая функция, отображаются в поле "Вызываемые функции" справа. (Можно выбрать любое поле, чтобы изменить текущую функцию.)

    В этом представлении отображается общее время (мс) и процент общего времени выполнения приложения, которое потребовалось для выполнения функции. текст функции также показывает общее время (и процент времени), затраченное на тело функции, за исключением времени, затраченного на вызовы и вызываемые функции. (В этом примере 2367 из 2389 мс были потрачены в теле функции, а остальные 22 мс были потрачены во внешнем коде, вызываемом этой функцией.

    Совет

    Высокие значения в теле функции могут указывать на узкие места производительности в самой функции.

  3. Чтобы просмотреть представление более высокого уровня, показывающее порядок вызова функций, выберите Дерево вызовов в раскрывающемся списке в верхней части панели.

    Каждая нумерованная область на рисунке относится к шагу процедуры.

    средства диагностики Дерево вызовов

    Образ Описание
    Шаг 1 Узел верхнего уровня в дереве вызовов использования ЦП, представляющий приложение.
    шаг 2 В большинстве приложений, когда параметр показать внешний код отключен, узел второго уровня — это узел [внешний код], содержащий системный и платформный код, который запускает и останавливает приложение, рисует пользовательский интерфейс, управляет планированием потоков и предоставляет другие низкоуровневые службы приложению.
    Шаг 3 Дочерними элементами узла второго уровня являются методы пользовательского кода и асинхронные подпрограммы, которые вызываются или создаются системой второго уровня и кодом платформы.
    Шаг 4 Дочерние узлы метода содержат данные только для вызовов родительского метода. Когда функция Показывать внешний код отключена, методы приложения также могут содержать узел [внешний код].

    Дополнительные сведения о значениях столбцов:

    • Total CPU указывает, сколько работ было выполнено функцией и любыми функциями, вызываемыми ею. Высокие общие значения ЦП указывают на функции, которые являются наиболее дорогими в целом.

    • Сам ЦП указывает, сколько работы было выполнено кодом в теле функции, исключая работу, выполненную функциями, которые она вызывала. Высокие показатели использования ЦП могут указывать на проблемы производительности в самой функции.

    • модули имя модуля, содержащего функцию, или количество модулей, содержащих функции в узле [внешний код].

    Чтобы просмотреть вызовы функции, использующие наибольший процент ЦП в представлении дерева вызовов, щелкните Развернуть горячий путь. Горячий путь может помочь сосредоточить свое расследование на области, которая будет иметь наибольшее влияние.

    снимок экрана, на котором показан горячий путь к средствам диагностики.

    Заметка

    Если в дереве вызовов отображается код, помеченный как "сломанный" код или "непроходимый стек", это означает, что, скорее всего, были потеряны события ETW (Event Tracing for Windows). Попробуйте собрать ту же трассировку во второй раз, чтобы устранить проблему.

  4. Чтобы просмотреть другое представление данных, выберите в раскрывающемся списке в верхней части области.

    Диаграмма пламени предоставляет другую визуализацию дерева вызовов, которая может помочь вам проанализировать данные. Дополнительные сведения см. в разделе Определение горячих путей с помощью графа пламени.

Просмотр внешнего кода

Внешний код — это функции в компонентах системы и платформы, которые выполняются в написанном коде. Внешний код включает функции, которые запускают и останавливают приложение, рисуют пользовательский интерфейс, потоки управления и предоставляют другие низкоуровневые службы приложению. В большинстве случаев вы не будете заинтересованы во внешнем коде, поэтому средство использования ЦП собирает внешние функции пользовательского метода в один [внешний вызов] узле.

Если вы хотите просмотреть пути вызова внешнего кода, отмените выбор показать только мой код из списка параметров , а затем выберите Применить.

снимок экрана, на котором показаны Настройки, затем Показать только мой код.

Внешний код — это функции в компонентах системы и платформы, которые выполняются в написанном коде. Внешний код включает функции, которые запускают и останавливают приложение, рисуют пользовательский интерфейс, потоки управления и предоставляют другие низкоуровневые службы приложению. В большинстве случаев вас не будет интересовать внешний код, поэтому инструмент анализа использования ЦП собирает внешние функции метода пользователя в один узел [внешний код].

Если вы хотите просмотреть пути вызова внешнего кода, выберите Показать внешний код из списка представления фильтра, а затем выберите Применить.

снимок экрана, на котором показан выбор представления фильтра, а затем отображение внешнего кода.

Имейте в виду, что многие цепочки вызовов внешнего кода глубоко вложены, поэтому ширина столбца 'Имя функции' может превышать ширину экрана практически всех мониторов, за исключением самых больших. В этом случае имена функций отображаются как [...].

Используйте поле поиска, чтобы найти нужный узел, а затем используйте горизонтальную полосу прокрутки для просмотра данных.

Совет

Если вы профилировали внешний код, который вызывает функции Windows, убедитесь, что у вас есть самый актуальный код.файлы pdb. Без этих файлов представления отчетов будут перечислять имена функций Windows, которые являются криптографическими и трудными для понимания. Чтобы узнать больше о том, как убедиться, что у вас есть необходимые файлы, см. в разделе Указание символов (PDB) и исходных файлов в отладчике.

Дальнейшие действия

В этом руководстве вы узнали, как собирать и анализировать данные об использовании ЦП. Если вы уже завершили ознакомительный тур по профилировщику, возможно, вам стоит пройти руководство, которое покажет, как использовать инструменты более эффективно.

В этом руководстве вы узнали, как собирать и анализировать данные об использовании ЦП во время отладки. Вы можете узнать больше о профилировании релизных сборок с помощью профилировщика производительности.