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


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

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

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

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

    Снимок экрана: выбор выпуска и локального компьютера.

    Снимок экрана: выбор выпуска и локального компьютера.

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

  3. В разделе Доступные инструменты выберите Загрузка ЦП и затем Запустить.

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

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

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

    Примечание.

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

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

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

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

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

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

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

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

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

Имя Описание
Общая активность ЦП [единица измерения, %] Уравнение для общего процента

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

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

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

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

Дополнительные сведения см. в разделе "Аналитика ЦП".

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

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

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

  • Вызывающий или вызывающий
  • Дерево вызовов
  • Модули
  • Функции
  • Flame Graph

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

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

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

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

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

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

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

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

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

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

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

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

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

Внешний код

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

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

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

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

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

Снимок экрана: показать внешний код.

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

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

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

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

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

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

Снимок экрана: поиск вложенного внешнего кода.

Снимок экрана: поиск вложенного внешнего кода.

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

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

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

Снимок экрана: асинхронный узел.

Разверните созданные методы, чтобы узнать, как это работает:

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

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

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

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

  • MainPage::<GetNumberAsync>b__b показывает время ЦП, затраченное на выполнение задач, которые вызывают GetNumber.

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

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

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

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

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

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

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

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

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

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