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


Анализ производительности с помощью профилирования ЦП в профилировщике производительности (C#, Visual Basic, C++, F#)

Хорошим способом начать изучение проблем с производительностью в приложении является понимание использования ЦП с помощью профилировщика ЦП. В средстве использования ЦП visual Studio отображается активное вычислительное время ЦП и процент, затраченный на выполнение кода в C++, C#/Visual Basic.

Средство использования ЦП поможет вам:

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

  • Определить проблемы с производительностью в сценариях DevOps Например, средство может помочь, когда клиент сообщает, что некоторые запросы или заказы не проходят через веб-сайт розничной торговли во время пикового сезона. Часто проблемы находятся в рабочей среде, и в данный момент сложно выполнить отладку, но это средство может помочь вам получить достаточно информации и доказательства проблемы. После сбора файла трассировки анализ может быстро помочь вам понять потенциальные причины и предложить решения в контексте вашего кода, чтобы вы могли предпринять следующие шаги для устранения проблемы.

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

Средство использования ЦП полезно как для локальных сеансов трассировки, так и для рабочей среды. Вы можете запустить инструмент «Загрузка ЦП» с помощью сочетания клавиш Alt+F2, затем выбрать «Загрузка ЦП»или открыть уже собранную трассировку с помощью средства, например dotnet-trace или dotnet-monitor. (Для производственного кода на .NET это, вероятно, наиболее распространённый способ сбора трассировок.)

Вы можете запустить средство использования ЦП в открытом проекте Visual Studio, в установленном приложении Microsoft Store или присоединенном к работающему приложению или процессу. Вы можете запустить средство использования ЦП при выпуске или отладке сборок. Дополнительные сведения см. в разделе Запуск средств профилирования при выпуске или отладке сборок.

В следующих инструкциях показано, как использовать средство использования ЦП без отладчика с помощью профилировщика производительности Visual Studio. В примерах используется сборка релизной версии на локальном компьютере. Релизные сборки лучше всего отражают фактическую производительность приложения. Для учебного пособия, показывающего, как улучшить производительность с использованием инструмента "CPU Usage", см. Пример исследования: Руководство для начинающих по оптимизации кода.

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

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

  1. В проекте Visual Studio задайте конфигурацию решения для выпуска и выберите локальный отладчик Windows (или локальный компьютер) в качестве целевого объекта развертывания.

    снимок экрана: Выбор Выпуска и Локальная Машина.

    скриншот, показывающий выбор Релиза и Локальная машина.

  2. Выберите Отладка>Профилировка производительности.

  3. В разделе Доступные средствавыберите Использование ЦП, а затем выберите Начать.

    Снимок экрана, показывающий выбор использования ЦП.

    Снимок экрана, показывающий выбор использования ЦП.

    Если вы включите параметр Start with collection paused перед запуском профилировщика, данные не будут собираться, пока вы не выберете кнопку записи в представлении сеанса диагностики.

    Заметка

    Дополнительные сведения о том, как сделать инструмент более эффективным, см. в разделе Оптимизация параметров профилировщика.

  4. После запуска приложения сеанс диагностики начинается и отображает данные об использовании ЦП. После завершения сбора данных выберите Остановить сбор.

    снимок экрана, на котором показано, как остановить сбор данных об использовании ЦП.

    снимок экрана, на котором показано, как остановить сбор данных об использовании ЦП.

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

    снимок экрана с отчетом об использовании ЦП.

    снимок экрана с отчетом об использовании ЦП.

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

Столбцы данных об использовании ЦП

Имя Описание
всего ЦП [единица, %] Уравнение % данных %

Миллисекунд времени вычисления ЦП и процент ЦП, используемый вызовами функции и функциями, вызываемыми функцией, в выбранном диапазоне времени. Это отличается от временного графика использования ЦП на временной шкале, который сравнивает общее использование ЦП в заданном временном диапазоне с общим доступным ЦП.
автономный ЦП [единица, %] % уравнение

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

Анализ аналитики ЦП

Если в разделе Top Insights отображаются какие-либо аналитические сведения, воспользуйтесь предоставленной ссылкой, чтобы получить дополнительные сведения об обнаруженной проблеме. Кроме того, если вы используете Copilot, кнопка Ask Copilot откроет окно чата Copilot, и Copilot предоставит предложения на основе кода и любых выявленных проблем.

Дополнительные сведения см. в обзоре по процессору .

Анализ использования ЦП

Чтобы проанализировать отчет об использовании ЦП, щелкните Открыть сведенияили щелкните одну из основных функций, чтобы открыть представление Функций.

В отчете представлены различные представления диагностических данных:

Просмотреть Описание
Вызывающий/вызываемый Подробное представление времени ЦП для конкретной функции, функций, которые вызывают её, и функций, которые она вызывает. Данные о производительности агрегируются за период сбора данных. Вы можете выбрать вызывающие функции и вызываемые функции для обхода пути вызова.
Дерево вызовов Иерархическое представление пути вызова функции. Используется для идентификации путей вызова, которые занимают больше всего времени ЦП (горячий путь).
Модули Представление времени ЦП, затраченного на отдельные модули, агрегированное за период сбора данных. Используется для выявления модулей, которые могут создавать узкие места в производительности из-за сочетания большого количества вызовов и или проблем с производительностью.
Функции Представление времени ЦП, затраченного на отдельные функции, агрегированное за период сбора данных. Используется для выявления функций, которые могут быть узкими местами производительности из-за большого количества вызовов и/или проблем с производительностью.
График пламени Иерархическое представление пути вызова функции в визуализации диаграммы пламени. Используется для идентификации путей вызова, которые занимают больше всего времени ЦП (горячий путь).

Чтобы проанализировать отчет, щелкните Создать подробный отчет.

В отчете представлены различные представления диагностических данных:

  • Вызывающий/вызываемый
  • Дерево вызовов

Во всех представлениях, кроме caller/callee, диагностический отчет сортируется по всегоЦП , от самого высокого до самого низкого. Измените порядок сортировки или столбец сортировки, выбрав заголовки столбцов. Вы можете дважды щелкнуть интересующую вас функцию, и вы увидите источник для функции, а также выделение, показывающее, где время тратится в этой функции. В таблице показаны столбцы с такими данными, как время, затраченное на функцию, включая вызываемые функции (Total CPU), и второй столбец, показывающий время, затраченное на функцию, за исключением вызываемых функций (Self CPU).

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

Дополнительные сведения об использовании Flame Graph см. в разделе Определение горячих путей с помощью Flame Graph.

Дерево вызовов использования ЦП

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

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

Структура дерева вызовов

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

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

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

Внешний код

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

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

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

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

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

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

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

Многие цепочки вызовов внешнего кода глубоко вложены, поэтому ширина цепочки может превышать ширину отображения столбца «Имя функции» . Затем имена функций отображаются, как показано на следующем рисунке.

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

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

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

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

Снимок экрана, на котором показано, как найти вложенный внешний код.

Снимок экрана, на котором показано, как найти вложенный внешний код.

Асинхронные функции в дереве вызовов использования ЦП

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

В следующем примере первые два узла в [внешний код] являются методами, созданными компилятором класса компьютера состояния. Третий узел — вызов исходного метода.

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

Раскройте созданные методы, чтобы показать, что происходит:

снимок экрана, на котором показан развернутый асинхронный узел.

снимок экрана, на котором показан развернутый асинхронный узел.

  • MainPage::GetMaxNumberAsyncButton_Click просто управляет списком значений задач, вычисляет максимальное количество результатов и отображает выходные данные.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext отображает действие, необходимое для планирования и запуска 48 задач, которые упаковывают вызов в GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b показывает активность задач, которые вызывают GetNumber.

Сбор количества вызовов (.NET)

Если вы хотите просмотреть количество вызовов в представлении "Функции", можно включить параметр перед началом профилировщика. Этот параметр поддерживается для типов проектов .NET и требует запуска процесса в профилировщике. Сценарий присоединения не поддерживается.

  1. Выберите значок "Настройки" для ЦП в профилировщике производительности.

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

  2. Включите параметр Сбор количества вызовов (только для .NET).

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

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

  4. Откройте представление "Функции", а затем убедитесь, что столбец "Количество вызовов" установлен как видимый.

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

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