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


Измерение производительности приложения путем анализа использования ЦП (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. Вы можете выбрать, следует ли просматривать использования ЦП, или обоих, с параметром Select Tools на панели инструментов. Если вы используете 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 указывает, сколько работ было выполнено функцией и любыми функциями, вызываемыми ею. Высокие общие значения ЦП указывают на функции, которые являются наиболее дорогими в целом.

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

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

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

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

    Заметка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Совет

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

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

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

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

Анализ использования центрального процессора в профилировщике производительности