Пошаговое руководство. Профилирование приложений
Обновлен: Ноябрь 2007
В данном пошаговом руководстве показано, как выполнить профилирование приложения для выявления проблем производительности.
В руководстве приводится пошаговое описания процесса профилирования управляемого приложения. Для поиска и определения проблем производительности приложения используются методы выборки и инструментирования.
В этом пошаговом руководстве выполняются следующие действия.
Профилирование приложения с помощью метода выборки.
Анализ результатов профилирования с выборкой для выявления и исправления проблем производительности.
Профилирование приложения с помощью метода инструментирования.
Анализ результатов профилирования с инструментированием для выявления и исправления проблем производительности.
Обязательные компоненты
Microsoft Visual Studio 2005 Team System.
Средний уровень знания языка C#.
Копия примера Пример PeopleTrax (средства профилирования).
Для работы со сведениями, полученными при профилировании, рекомендуется включить отладочные символы.
Профилирование с помощью метода выборки
Выборка — это метод профилирования, при котором анализируемый процесс периодически опрашивается с целью определения активной функции. Результирующие данные показывают, как часто анализируемая функция находилась на вершине стека вызовов при выборочном опросе процесса.
Профилирование приложения с помощью метода выборки
Откройте решение PeopleTrax в среде Microsoft Visual Studio 2005.
Решение PeopleTrax отобразится в обозревателе решений.
В меню Анализ щелкните Запустить мастер производительности.
Откроется мастер производительности.
В раскрывающемся списке Доступные конечные объекты выберите PeopleTrax и нажмите кнопку Далее.
Щелкните Выборка и нажмите кнопку Далее.
Нажмите кнопку Готово.
Установите для параметра конфигурации проекта значение Выпуск.
Для обнаружения проблем производительности приложения рекомендуется использовать выпускное построение.
Выпускная сборка рекомендуется для профилирования по той причине, что отладочная сборка содержит дополнительные сведения, скомпилированные при построении, которые могут отрицательно влиять на производительности и неадекватно демонстрировать проблемы производительности.
Выпускное построение не предоставляет символьные сведения автоматически. Сведения о настройке построения для отображения символьных сведений в отчетах производительности профилировщика см. в разделах /Z7, /Zi, /ZI (формат отладочной информации) и Практическое руководство. Справочная информация о символах Windows.
На панели инструментов обозревателя производительности щелкните Запуск.
Visual Studio 2005 выполняет построение проекта и запускает профилирование приложения. Открывается окно приложения PeopleTrax.
Щелкните Получить пользователей.
Щелкните Экспортданных.
Открывается Блокнот, в котором отображается новый файл, содержащий данные, экспортированные из средства PeopleTrax.
Закройте Блокнот и приложение PeopleTrax.
Visual Studio 2005 создает отчет сеанса производительности (*.vsp) и автоматически загружает его.
Анализ результатов профилирования с выборкой
На панели инструментов окна профилировщика откройте раскрывающийся список отчетов и выберите представление Функции для отчета.
Щелкните правой кнопкой мыши таблицу данных и выберите Добавить или удалить столбцы.
Откроется диалоговое окно Добавление или удаление столбцов.
В списке столбцов выберите Имя исходного файла и нажмите кнопку ОК.
В таблице данных щелкните столбец Имя исходного файла, чтобы отсортировать таблицу данных.
В результате сортировки этого столбца группируются все строки, относящиеся к решению PeopleTrax.
Найдите строки, в которых отображаются данных для решения PeopleTrax.
После просмотра этих строк можно заметить, что выборка указанных ниже функций выполнялась чаще, чем других частей решения PeopleTrax:
PeopleTrax.Form1.GetPeopleButton_Click
Установите фокус на событие GetPeopleButton_Click.
Щелкните правой кнопкой мыши строку PeopleTrax.Form1.GetPeople_Click и выберите Просмотреть исходный код.
В редакторе кода открывается файл Form1.cs, курсор расположен на событии GetPeopleButton_Click.
Просмотрите исходный код для события GetPeopleButton_Click.
После просмотра кода можно определить области для оптимизации.
Если требуется добавлять элементы по одному с помощью метода Add класса ListView.ListViewItemCollection, можно использовать метод BeginUpdate, чтобы при каждом добавлении нового элемента список не перерисовывался. По завершении добавления элементов в этот элемент управления вызовите метод EndUpdate для разрешения перерисовки списка. Благодаря этому методу список не будет мерцать во время добавления к элементу управления большого числа элементов. Кроме того, сократится время, необходимое на заполнение списка.
По умолчанию в файле App.Config может содержаться 1500 имен.
При установке цвета текста для элемента списка можно увеличить производительность, используя перечисление KnownColor вместо указания цвета в строке и вызова метода Color.FromName.
Это событие вызывает функцию People.GetPeople, которая извлекает массив имен и добавляет его в список.
Щелкните правой кнопкой мыши вызов функции GetPeople и выберите команду Перейти к определению.
После просмотра кода можно определить области для оптимизации.
Доступ к коду для извлечения новых массивов имен fullName и companyName осуществляется многократно; следует создать эти массивы один раз и использовать их повторно.
Чтобы заменить данные проблемные области оптимизированным кодом, добавьте символ условной компиляции OPTIMIZED_GETPEOPLE в проекты PeopleTrax и People.
В обозревателе решений щелкните правой кнопкой мыши проект PeopleTrax и выберите команду Свойства.
Откроется форма свойств проекта PeopleTrax.
Перейдите на вкладку Построение.
В текстовом поле Символы условной компиляции добавьте OPTIMIZED_GETPEOPLE.
Повторите шаги 18 – 20 для проекта People.
Закройте формы свойств проекта и при появлении соответствующего приглашения сохраните все изменения.
Рекомендуется запустить сеанс профилирования еще раз даже в том случае, если наблюдается очевидное повышение производительности. Важно просмотреть данные после исправления проблемы, поскольку первая проблема может закрывать некоторые другие проблемы.
Теперь выполните профилирование приложения с помощью метода инструментирования.
Профилирование с помощью метода инструментирования
Инструментирование представляет собой метод профилирования, с помощью которого в особым образом построенные версии профилированных двоичных файлов внедряются функции-зонды. Эти зонды собирают временную информацию о входе и выходе функций в инструментированном модуле. Поскольку данный метод профилирования является более активным, чем выборка, он приводит к значительному увеличению нагрузки. Инструментированнные двоичные файлы увеличиваются в размере по сравнению с двоичными файлами для отладки или выпуска. Кроме того, такие файлы не предназначены для развертывания.
Профилирование существующего приложения с помощью метода инструментирования
В обозревателе производительности выберите в раскрывающемся списке пункт Инструментирование.
В панели инструментов обозревателя производительности нажмите кнопку Запуск.
Microsoft Visual Studio 2005 выполняет построение проекта и запускает профилирование приложения. Открывается окно приложения PeopleTrax.
Щелкните Получить пользователей.
Выполняется заполнение таблицы данных PeopleTrax.
Щелкните Экспорт данных.
Открывается Блокнот, в котором отображается новый файл, содержащий список пользователей проекта PeopleTrax.
Закройте Блокнот и приложение PeopleTrax.
Microsoft Visual Studio 2005 создает отчет сеанса производительности (*.vsp).
Анализ результатов профилирования с инструментированием
В представлении Сводка отчета просмотрите сводные таблицы, чтобы определить наиболее часто вызываемые функции и области приложения, на выполнение которых затрачено максимальное время.
На основе этих сведений можно увидеть, что наибольшее время было затрачено на выполнение операций System.String.Concat.
Дважды щелкните запись System.String.Concat в любой из сводных таблиц.
Отчет переключается к представлению Функции, в котором выделена функция System.String.Concat.
Щелкните правой кнопкой мыши строку System.String.Concat и выберите команду Показать в представлении вызывающий/вызываемый.
Отчет переключается к представлению Вызывающий/вызываемый, в котором показано, что данная функция вызывалась объектом PeopleTrax.Form1.ExportData.
Щелкните правой кнопкой мыши строку PeopleTrax.Form1.ExportData и выберите команду Просмотреть исходный код.
В редакторе кода открывается файл Form1.cs, курсор расположен на функции ExportData.
Просмотрите исходный кода для функции ExportData.
После изучения данного кода можно заметить, что функция System.String.Concat не вызывалась непосредственно. Вместо этого в коде несколько раз использовался операнд +=, который в IL заменялся функцией System.String.Concat. Любые изменения строки в платформе .NET Framework приводят к выделению памяти для новой строки. В .NET Framework содержится класс StringBuilder, оптимизированный для объединения строк.
Чтобы заменить данную проблемную область оптимизированным кодом, добавьте символ условной компиляции OPTIMIZED_EXPORTDATA в проект PeopleTrax.
В обозревателе решений щелкните правой кнопкой мыши проект PeopleTrax и выберите команду Свойства.
Откроется форма свойств проекта PeopleTrax.
Перейдите на вкладку Построение.
В текстовом поле Символы условной компиляции добавьте OPTIMIZED_EXPORTDATA.
Закройте форму свойств проекта и при появлении соответствующего приглашения выберите Сохранить все.
Если запустить приложение еще раз, можно заметить, что производительность заметно повысилась. Рекомендуется запустить сеанс профилирования еще раз даже в том случае, если наблюдается очевидное повышение производительности. Важно просмотреть данные после исправления проблемы, поскольку первая проблема может закрывать некоторые другие проблемы.
См. также
Ссылки
/Z7, /Zi, /ZI (формат отладочной информации)