Первое знакомство со средствами профилирования — Visual Studio (Windows)
- Статья
- Чтение занимает 11 мин
Область применения:Visual StudioVisual Studio для Mac Visual Studio Code
Visual Studio предоставляет широкий набор средств профилирования для выявления различных типов проблем с производительностью в зависимости от типа приложения. В этой статье мы кратко рассмотрим наиболее распространенные средства профилирования.
Сведения о выборе правильного средства или о поддержке средств профилирования для различных типов приложений см. в статье Какое средство следует использовать?
Использование профилировщика для повышения производительности
Если вы разработчик, который работает по телефону для базы кода вашей команды или вы написали веб-приложение, то вы могли задаться вопросом, почему ваше приложение получает медленное время отклика? Часто проблемы находятся в рабочей среде, и в этот момент сложно изучить, но средства профилирования помогут вам собрать достаточно информации и доказательств проблемы.
Существует несколько способов диагностики проблем с производительностью при работе с API, но использование профилировщика поможет быстро определить и исключить возможные причины, чтобы у вас был четкий путь к решению проблемы.
В разработке программного обеспечения профилировщик — это средство, которое помогает анализировать производительность приложений для улучшения низкой производительности кода. Средства профилирования и диагностики позволяют разработчикам диагностировать использование памяти и ЦП и выявлять другие проблемы на уровне приложения. С помощью этих средств можно собирать данные о производительности во время запуска приложения.
Профилировщик помогает быстро принимать обоснованные решения, предоставляя визуальное представление времени выполнения и использования ЦП для приложения. Гораздо проще и быстрее понять проблемы и устранить их, если вы видите график времени выполнения или загрузки ЦП.
Измерение производительности во время отладки
Средства профилирования, которыми можно воспользоваться во время сеанса отладки, доступны в окне «Средства диагностики».
При отладке можно использовать окно Средства диагностики для анализа использования ЦП и памяти, а также просматривать события, отображающие сведения, связанные с производительностью.
Средства, доступные в окне «Средства диагностики» или во время сеанса отладки:
- Загрузка ЦП
- Использование памяти.
- PerfTips
Совет
Используйте повторный запуск, чтобы пропустить страницу запуска и автоматически запустить с предыдущими параметрами, нажав
Примечание
Для запуска средств профилирования с отладчиком (окно Средства диагностики) требуется Windows 8 и более поздние версии. Вы можете использовать средства последующего анализа с Windows 7 и более поздними версиями.
Измерение производительности в сборках выпуска
Средства в Профилировщике производительности предназначены для анализа сборок выпуска. В профилировщике производительности можно собрать диагностические сведения во время работы приложения, а затем проанализировать их после его остановки (последующий анализ).
Откройте Профилировщик производительности, последовательно выбрав Отладка>Профилировщик производительности (или нажмите клавиши ALT + F2).
Дополнительные сведения об использовании средства «Загрузка ЦП» или «Использование памяти» в Профилировщике производительности и средств, встроенных в отладчик, см. в статье Запуск средств профилирования с отладчиком или без него.
Средства, доступные в Профилировщике производительности:
- Загрузка ЦП
- Распределение объектов .NET
- Использование памяти.
- Средство .NET Async.
- Инструментирование
- Файловый ввод-вывод
- Счетчики .NET
- Средства базы данных.
- Использование GPU
См. дополнительные сведения о рекомендуемом средстве профилирования с поддержкой разных типов приложений.
В некоторых сценариях в окне можно выбрать несколько средств профилирования. Средства, такие как «Загрузка ЦП», могут предоставлять дополнительные данные, полезные для проведения анализа. Вы также можете использовать профилировщик командной строки, чтобы поддержать сценарии, включающие несколько средств профилирования.
Проверка производительности с помощью PerfTips
Зачастую просмотреть сведения о производительности проще всего с помощью PerfTips. Используя подсказки, вы можете просматривать сведения о производительности непосредственно при взаимодействии с кодом. Можно проверить такие сведения, как длительность события (измеряется с момента последней приостановки отладчика или с момента запуска приложения). Например, при пошаговом выполнении кода (F10, F11) PerfTips отображает длительность выполнения приложения с операции на предыдущем шаге до текущего шага.
PerfTips можно использовать для проверки длительности выполнения блока кода или времени, необходимого для завершения работы одной функции.
PerfTips отображает те же события, которые также выводятся в представлении События средств диагностики. В представлении События приводятся различные события, которые возникают при отладке, например операция задания точки останова или пошагового выполнения кода.
Примечание
Если у вас установлен выпуск Visual Studio Enterprise, на этой вкладке вы можете увидеть события IntelliTrace.
Анализ использования ЦП
Средство загрузки ЦП является хорошей отправной точкой для анализа производительности приложения. С его помощью вы получите дополнительные сведения о ресурсах ЦП, используемых приложением. Вы можете использовать средство «Загрузка ЦП», встроенное в отладчик, или средство «Использование ЦП»последующего анализа.
При использовании средства «Загрузка ЦП», встроенного в отладчик, откройте окно «Средства диагностики» (если оно закрыто, выберите Отладка > Окна > Показать средства диагностики). Во время отладки откройте представление Сводка и выберите Запись профиля ЦП.
Единственный способ использовать средство — установить в коде две точки останова: одну в начале и одну в конце функции и области кода, которые требуется проанализировать. Проверьте данные профилирования во время приостановки во второй точке останова.
В представлении Загрузка ЦП отображается список функций, упорядоченных по самой продолжительно выполняющейся, которая расположена в верхней части раздела Важнейшие функции. В разделе Критический путь отображается стек вызовов для функций, которые используют максимальную загрузку ЦП. Эти списки помогут переходить к функциям, где наблюдаются проблемы с производительностью.
В представлении Загрузка ЦП отображается список функций, упорядоченных по самой продолжительно выполняющейся (эта функция расположена в верхней части). Это поможет переходить к функциям, где наблюдаются проблемы с производительностью.
Щелкните интересующую вас функцию, и вы увидите более подробное представление «Дерево вызовов » с выделенной функцией. В таблице отображаются столбцы с данными, такими как время, затраченное на выполнение функции, включая вызываемые функции (ЦП (всего) ), и второй столбец, показывающий время, затраченное на выполнение функции, за исключением вызываемых функций (Собственная активность ЦП). Эти данные помогут оценить, оказывает ли негативное влияние на производительность сама функция.
Совет
Профилировщик Visual Studio поддерживает как сбор, так и просмотр трассировок. Профилировщик также может просматривать трассировки, собранные ранее другими средствами, такими как dotnet-trace. Dotnet-trace создает результаты выборки, а не инструментированную трассировку. Дополнительные сведения см. в разделе dotnet-trace.
Щелкните интересующую вас функцию, и вы увидите более подробное представление «бабочка» с выбранной функцией в середине окна, вызывающая функция слева и вызываемые функции справа. В разделе Тело функции также показан общий объем времени (и доля времени), затраченного в теле функции за исключением времени, затраченного в вызываемых и вызывающих функциях. Эти данные помогут оценить, оказывает ли негативное влияние на производительность сама функция.
Анализ данных об использовании памяти
В окне средств диагностики также можно оценить использование памяти в приложении с помощью средства Использование памяти. Например, можно узнать число и размер объектов в куче. В Профилировщике производительности можно использовать средство «Использование памяти», встроенное в отладчик или средство «Использование памяти» для последующего анализа.
Разработчики .NET могут выбрать средство распределения объектов .NET или средство Использование памяти.
- Средство выделения объектов .NET помогает определять закономерности и аномалии выделения в коде .NET, а также обнаруживать распространенные проблемы, связанные со сборкой мусора. Оно используется только в качестве инструмента последующего анализа. Этот инструмент можно запускать на локальных или удаленных компьютерах.
- Средство Использование памяти полезно при определении утечек в памяти, которые не являются характерными для приложений .NET. Если при проверке памяти необходимо использовать функции отладчика, например пошаговое выполнение кода, рекомендуется выбирать средство «Использование памяти», встроенное в отладчик.
Для анализа использования памяти с помощью средства использования памяти необходимо сделать хотя бы один моментальный снимок памяти. Часто наилучшим способом анализа памяти является создание двух снимков: первый создается непосредственно перед возникновением потенциальной проблемы с памятью, а второй — сразу же после возникновения этой проблемы. Затем можно просмотреть различия двух моментальных снимков и точно определить, что изменилось. На следующем рисунке показано создание моментального снимка с помощью средства, встроенного в отладчик.
При выборе одной из ссылок со стрелками вы дается разностное представление кучи (красная стрелка вверх показывает увеличение числа объектов (слева) или увеличение размера кучи (справа)). Если щелкнуть ссылку справа, откроется разностное представление кучи, упорядоченное по объектам, которые привели к максимальному увеличению размера кучи. Это может помочь выявить проблемы с памятью. Например, на следующем рисунке байты, используемые объектами
, увеличены на 3 492 байт на втором моментальном снимке.
Если в представлении Использование памяти щелкнуть ссылку слева, представление кучи будет упорядочено по количеству объектов. Объекты определенного типа, количество которых максимально выросло, отображаются в верхней части (отсортированы по столбцу
Анализ асинхронного кода (.NET)
Средство .NET Async позволяет проанализировать производительность асинхронного кода в приложении. Это средство доступно в Профилировщике производительности. Откройте Профилировщик производительности, последовательно выбрав Отладка>Профилировщик производительности (или нажмите клавиши ALT + F2).
Средство отображает все асинхронные операции в представлении списка. Вы можете просмотреть такие сведения, как время начала и окончания, а также общее время асинхронной операции.
Анализ асинхронного кода (.NET)
Средство .NET Async позволяет проанализировать производительность асинхронного кода в приложении. Это средство доступно в Профилировщике производительности. Откройте Профилировщик производительности, последовательно выбрав Отладка>Профилировщик производительности (или нажмите клавиши ALT + F2).
Средство отображает все асинхронные операции в представлении списка. Вы можете просмотреть такие сведения, как время начала и окончания, а также общее время асинхронной операции.
Изучение событий приложения
Средство просмотра общих событий позволяет просматривать действия приложения с помощью списка событий, таких как загрузка модуля, запуск потока и конфигурации системы. Это позволяет эффективнее диагностировать работу приложения в профилировщике Visual Studio. Это средство доступно в Профилировщике производительности. Откройте Профилировщик производительности, последовательно выбрав Отладка>Профилировщик производительности (или нажмите клавиши ALT + F2).
Это средство отображает каждое событие в представлении списка. Столбцы содержат сведения о каждом событии, например имя события, метку времени и идентификатор процесса.
Инструментирование
Инструментирование аналогично средству «Загрузка ЦП», за исключением того, что вместо выборки используется инструментирование. Метод инструментирования требует дополнительных затрат, но вы можете получить точное количество вызовов по количеству вызовов функций. Это средство доступно в Профилировщике производительности. Откройте Профилировщик производительности, последовательно выбрав Отладка>Профилировщик производительности (или нажмите клавиши ALT + F2). Дополнительные сведения см. в разделе Инструментирование.
Проверка операций файлового ввода-вывода
Средство файлового ввода-вывода позволяет понять, как оптимизировать соответствующие операции, чтобы повысить производительность приложений. Если вы пытаетесь изучить и диагностировать время при медленной загрузке, новое средство файлового ввода-вывода позволит вам понять, как операции ввода-вывода влияют на затрачиваемое время. Это средство доступно в Профилировщике производительности. Откройте Профилировщик производительности, выбрав «Отладка > Профилировщик производительности» или нажав клавиши ALT+F2.
Средство покажет операции чтения и записи файлов в представлении списка с вкладками.
Анализ производительности базы данных (.NET Core)
Для приложений .NET Core, использующих ADO.NET или Entity Framework Core, средство для работы с базами данных позволяет записывать запросы к базам данных, которые приложение выполняет во время диагностического сеанса. Сведения об отдельных запросах затем можно анализировать, чтобы определить области для улучшения производительности приложения. Это средство доступно в Профилировщике производительности. Откройте Профилировщик производительности, последовательно выбрав Отладка>Профилировщик производительности (или нажмите клавиши ALT + F2).
Это средство отображает каждый запрос в представлении списка. Вы можете просмотреть такие сведения, как время начала и длительность запроса.
Визуализация счетчиков .NET (.NET Core)
Начиная с Visual Studio 2019 версии 16.7 вы можете использовать средство Счетчики .NET в Visual Studio для визуализации счетчиков производительности. Вы можете визуализировать счетчики, созданные с помощью счетчиков dotnet. Счетчики dotnet поддерживают множество счетчиков, такие как «Использование ресурсов ЦП» и «Размер кучи сборщика мусора».
Средство отображает текущие значения для каждого счетчика в представлении списка.
Анализ использования ресурсов (XAML)
В приложениях XAML, таких как классические приложения WPF и приложения универсальной платформы Windows, можно анализировать потребление ресурсов, используя средство «Временная шкала приложения». Например, вы можете проанализировать время, затраченное приложением на подготовку кадров пользовательского интерфейса (макет и обработка), обработку запросов от сети и дисков, а также на такие сценарии, как запуск приложения, загрузка страницы и изменение размера окон. Чтобы использовать это средство, выберите Временная шкала приложения в профилировщике производительности и нажмите кнопку Запустить. В приложении выполните сценарий с предполагаемой проблемой потребления ресурсов, а затем щелкните Остановка сбора, чтобы создать отчет.
Низкие значения частоты кадров на графе Пропускная способность визуализации может означать наличие проблем визуализации, присутствующих при запуске приложения. Аналогично, высокие показатели на графе Использование потока пользовательского интерфейса могут соответствовать проблемам со скоростью отклика пользовательского интерфейса. В отчете можно выбрать временной период предполагаемой проблемы производительности и затем в представлении «Подробная временная шкала» (нижняя панель) изучить подробные действия потока пользовательского интерфейса.
В представлении «Подробная временная шкала» находятся такие сведения, как тип действия (или затронутый элемент пользовательского интерфейса), а также длительность действия. Например, на рисунке событие Макета для элемента управления сетки длится 57,53 мс.
Дополнительные сведения см. в разделе Временная шкала приложения.
Проверка событий производительности и доступности пользовательского интерфейса (UWP)
В приложениях UWP в окне Средства диагностики можно включить параметр Анализ пользовательского интерфейса. Средство выполняет поиск общих проблем производительности или доступности и во время отладки отображает их в представлении События. В описаниях событий содержатся сведения, которые могут помочь при устранении неполадок.
Анализ использования GPU (Direct3D)
В приложениях Direct3D (компоненты Direct3D должны быть в C++) можно изучить действие GPU и проанализировать проблемы производительности. Дополнительные сведения см. в разделе Использование GPU. Чтобы использовать это средство, выберите Использование GPU в профилировщике производительности и нажмите кнопку Запустить. В приложении выполните нужные действия профилирования, а затем щелкните Остановка сбора, чтобы создать отчет.
Выберите период времени на графах и щелкните Просмотреть сведения. В нижней панели появится представление подробных сведений. В этом представлении можно узнать, сколько событий происходит в каждом ЦП и графическом процессоре. Выбирайте события в самой нижней панели, чтобы открывать всплывающие окна на временной шкале. Например, выберите событие Присутствующие, чтобы просмотреть всплывающие окна по вызову Присутствующий. (Светло-серые вертикальные линии Vsync можно использовать в качестве точек отсчета для понимания того, пропустили ли вертикальную синхронизацию определенные вызовы с типом Присутствующий. Требуется один вызов с типом Присутствующие между каждыми двумя вертикальными синхронизациями, чтобы приложение стабильно достигало 60 FPS.)
Графы также можно использовать для определения узких мест производительности ЦП или GPU.
Анализ производительности (устаревшие инструменты)
В Visual Studio 2019 устаревший Обозреватель производительности и связанные средства профилирования, такие как мастер производительности, были объединены в Профилировщик производительности, который можно открыть с помощью команды Отладка>Профилировщик производительности. В Профилировщике производительности доступные средства диагностики зависят от выбранного целевого объекта и текущего открытого запускаемого проекта. Инструмент «Загрузка ЦП» предоставляет возможности выборки, ранее поддерживаемые мастером производительности. Средство инструментирования предоставляет возможность профилирования с инструментированием (для точного числа и длительности вызовов), которая была представлена в мастере производительности. В Профилировщике производительности также содержатся дополнительные средства памяти.
См. также раздел
- Какие средства следует использовать?
- Запуск средств профилирования с отладчиком или без него
Оценка качества программного обеспечения вычислительных систем
Для того, чтобы понять, в каких местах или при каких сценариях производительность приложения низкая, необходимо использовать соответствующие инструменты, которые позволяют получить информацию об использовании ресурсов устройства вашим приложением. Такие инструменты называются профайлерами, и Visual Studio 2011 Express содержит в своем составе.
Инструменты профилирования приложений для Windows Store в Visual Studio 2011 Express позволяют измерять значения и определять ключевые моменты работы наших приложений. Профайлер собирает временную информацию приложений, написанных на Visual C++, Visual C# и Visual Basic, используя соответствующие методы, которые вызываются через определенный интервал в соответствии со стеком вызовов ЦПУ. Графическое отображение результатов профилирования легко позволяет найти нужное место в приложении и определить производительность его отдельных частей. У нас есть возможность профилировать приложение от момента его запуска и до остановки или же запускать профилирование только в интересующих нас сценариях.
Во время профилирования приложения желательно выбирать для него тип сборки Release,потому что именно в этом типе сборки приложение по своему содержимому больше всего похоже на то, которые пользователь поставит себе из Microsoft Store.
Для запуска профилирования приложения выберите в главном меню Visual Studio пункт Debug–> Start Performance Analysis или нажать комбинацию клавиш Alt+F12 (рис. 13).
Рис. 13. Профилирование приложения
После выполнения необходимых сценариев работы приложения следует остановить анализ производительности приложения, и приложение Visual Studio начнет формирование отчета производительности приложения. Результатом будет следующий отчет (рис. 14, 15).
Рис. 14. Процесс формирования отчета о производительности приложения
Рис. 15. Отчет о производительности приложения
Другой механизм отслеживания работы приложения – это включение счетчиков кадров. В текущей версии это делается путем изменения ключей в регистре:
- для 32–битной Windows 8:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Xaml] «EnableFrameRateCounter»=dword:00000001 - – для 64–битной Windows 8:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Xaml] «EnableFrameRateCounter»=dword:00000001
После изменения соответствующего ключа в реестре системы при запуске приложения будут отображаться счетчики кадров (рис. 16).
Рис. 16. Счетчик кадров
Первое значение слева показывает количество кадров, обрабатываемых в секунду в потоке компоновщика, то есть на GPU видеокарты. Второе число – количество кадров в секунду, которое обрабатывает центральный процессор. Третье – использование памяти приложением. Последние два значения отображают время в миллисекундах для потока компоновщика и интерфейсного потока соответственно.
Таким образом, используя рассмотренные выше способы контроля работоспособности и анализа производительности приложения, мы можем стабилизовать его работу и предоставить пользователям продукт высокого качества.
Пример:
To view this video please enable JavaScript, and consider upgrading to a web browser that supports HTML5 video
Процент выполнения кода профиля C (построчная аннотация)
спросил
Изменено 1 год, 9 месяцев назад
Просмотрено 2к раз
Мне нужно профилировать пару кодов C и получить аннотированный файл с процентом времени выполнения, занимаемым каждой строкой или, по крайней мере, каждым блоком (пока/если-иначе/для-функций) и т. д.
До сих пор я изучал valgrind(callgrind), gperf и некоторые другие инструменты. Пока что я получаю
- Количество каждой функции или строки исходного кода, например, сколько раз она выполняется.
- или процент от подсчета.
- Или время выполнения каждого вызова функции.
Что мне нужно, однако, если процент времени выполнения не учитывается, и это должно быть для каждой строки исходного кода или, по крайней мере, для всех блоков (пока/если-иначе/для-функций).
Кто-нибудь может сообщить мне, как это сделать?
Спасибо,
- C
- АННОТАЦИИ
- Профилирование
- Valgrind
- GPERF
Я считаю, что Perfie вы хотите. Он использует основанную на ядре подсистему под названием Счетчики производительности для Linux , включенную в более новые ядра. Более подробную информацию можно найти здесь.
Простой пример использования ниже. Обязательно компилируйте с отладочными символами.
$ производительная запись ./myprogram arg1 arg2 $ производительный отчет
Cachegrind тоже стоит изучить.
3
Вам нужно что-то, что производит выборку стека либо по времени ЦП, либо по времени настенных часов, если вы хотите включить ввод-вывод. Вам не нужна особенно высокая частота дискретизации.
Каждый образец стека представляет собой список участков кода, некоторые из которых можно проследить до строк в коде.
Включающая процентная стоимость строки кода равна просто количеству содержащих ее выборок стека, деленному на общее количество выборок стека (умноженному на 100).
Полезность этого заключается в том, что он показывает, какой процент общего времени вы могли бы сэкономить, если бы избавились от этой строки.
Эксклюзивный процент — это доля выборок, в которых эта строка появляется в конце.
Если строка кода встречается в образце стека более одного раза, это все равно только один образец, содержащий ее. (Это заботится о рекурсии.)
Какие инструменты могут это сделать? Возможно oprofile
. Конечно Zoom
.
6
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Профилирование кода C в Linux с помощью gprof
Сводка: gprof
— это инструмент анализа производительности для Linux. Используйте его, скомпилировав код C с параметром -pg
для gcc
, воспроизведя проблему, а затем запустив gprof
для ранее созданного файла gmon.out
.
Предыстория
Я писал кроссплатформенный код C, который хорошо работал на моем ПК с Windows 10, но не так хорошо работал на Raspberry Pi 4 под управлением ОС Raspberry Pi. Программа резко замедлялась, и быстрый анализ показал, что существует узкое место процессора. Мне нужен был профилировщик, чтобы увидеть, на что тратится процессорное время программы. Я решил использовать гпроф
.
Шаги
Во-первых, код необходимо перекомпилировать с параметром -pg
для компилятора gcc
. Этот параметр необходимо применять как на этапе компиляции, так и на этапе компоновки. Параметр -pg
создает инструменты, которые отслеживают вызовы функций во время выполнения.
После перестроения программы запустите ее еще раз и воспроизведите проблему. В идеале позвольте медленной части программы выполняться несколько раз, чтобы получить хороший образец проблемы. Выйдите из программы, и вы должны увидеть, что был сгенерирован новый файл: gmon.out
. Этот файл содержит данные, собранные прибором -pg
.
Следующим шагом является обработка gmon.out
с использованием gprof
. Инструмент принимает два аргумента: имя исполняемого файла, который использовался для создания файла gmon.out, и путь к файлу gmon.out. Этот инструмент генерирует много выходного текста, поэтому вы можете перенаправить его в текстовый файл. Запустите его следующим образом:
$ gprof /path/to/exe /path/to/gmon.out > gmon.txt
Откройте файл gmon.txt
, и вы увидите результаты, которые выглядят примерно так:
% совокупный собственный собственный общий время секунды секунды вызовы мс/вызов мс/имя вызова 80,01 0,12 0,12 392 0,31 0,31 Функция А 20,00 0,15 0,03 2480 0,01 0,01 ФункцияX 0,00 0,15 0,00 169740 0,00 0,00 Функция B 0,00 0,15 0,00 144896 0,00 0,00 Функция Y
Соображения
Будьте осторожны при интерпретации результатов. В сгенерированном выводе есть объяснение значения различных столбцов. Совокупное время включает в себя вызовы других функций, поэтому имейте в виду взаимосвязь между вызывающей и вызываемой функциями (выходные данные также включают выборочные стеки вызовов, которые могут быть полезны для понимания этого). Кроме того, учтите, что gprof
не отслеживает вызовы, сделанные в библиотеки, которые не были созданы с параметром -pg
, поэтому вместо этого время, проведенное в этих библиотеках, может быть отнесено к вызывающей функции.
Мои выводы
Возвращаясь к проблеме, с которой я столкнулся на Raspberry Pi, оказалось, что у меня был довольно неэффективный код, который делал слишком много вызовов графических библиотек ОС. В Windows эта проблема маскировалась отличной производительностью графического драйвера. В ОС Raspberry Pi графический стек не справлялся, и проблема стала очевидной. Поскольку я не могу полагаться на производительность графической реализации конкретной системы, я собираюсь оптимизировать собственный код, сводя к минимуму обращения к графическим библиотекам ОС.