Visual Studio 2010: работа с новым профайлером

 

Мне уже довелось демонстрировать, как новая итоговая страница профайлера позволяет проще находить и исправлять проблемы производительности, но порой для поиска требуется больше усилий. В этот раз я углублюсь в своем рассказе в другую фичу VS2010, которая называется Function Details View (детали функции).

Снова для демонстрации я буду использовать приложение PeopleTrax, которое вы можете скачать с CodeBox. У меня есть отчет, который я собрал ранее используя функцию CPU Sampling в профайлере, в котором приложение сильно нагружает CPU (по крайне мере на одном ядре).

В этом отчете я смотрю на горячий след (Hot Path) и вижу, что метод People.GetNames вызывает две горячие функции StringReader.ReadLine() и String.Trim().

Мне хочется увидеть эти ресурсоемкие вызовы в моем коде, так что я щелкаю на GetNames (выделено сиреневым выше) чтобы вывести окно с деталями функции.

Здесь есть несколько вещей, на которые стоит обратить внимание:

  • в заголовке указано наименование метода People.GetNames();
  • с помощью нисподающего меню можно переключаться между "Inclusive Samples %" и "Inclusive Samples";
  • синие плашки показывают функции, которые вызывают метод People.GetNames() или вызываются им;
  • интересующий меня код показан с подсветкой и аннотацией;
  • в представлении по умолчанию нам может потребоваться раздвинуть окно, чтобы увидеть весь код. Вместо этого, можно воспользоваться кнопкой Split Screen Vertically и изменить представление.

Теперь, на правой стороне представления, мы четко видим где происходят ресурсоемкие вызовы функций ReadLine() и Trim() в нашем коде. Кроме того, у нас в наличии есть таблица метрик в секции Function Performance Details и некоторые полезные по теме ссылки.

Теперь, давайте взглянем на синие плашки. Левая плашка показывает методы, которые вызывают нашу функцию. Высота плашки представляет относительную стоимость в текущей выбранной метрике (в данном случае - Inclusive Samples). Так как в этом случае есть всего один вызывающий метод, он занимает всю площадь плашки.

Справа другая плашка, которая содержит следующие секции:

  • Function Body (87 экземпляров). Высота этой секции показывает относительное число экземпляров внутри самой функции.
  • ReadLine (727 экземпляров). Это функция с самым большим числом экземпляров (Inclusive Samples). Из-за этого высота этой секции самая большая.
  • Trim (642 экземпляров). Функция вторая по количеству экземпляров (Inclusive Samples). Немного меньшая высота секции.
  • и другие функции с меньшим числом экземпляров.
Каждая из этих секций (кроме Function Body) кликабельна, что позволяет производить навигацию по вызывающим или вызываемым методам.

Изучив код я не могу найти простого решения для его упрощения, я не могу контролировать работу Trim() или ReadLine(), так что давайте перейдем на один уровень выше в вызывающих функциях, щелкнув на GetPeople (это единственная функция, которая вызывает наш метод GetNames - прим. перев.).

Нажатие на GetPeople приводит к переходу на детали для данной функции:

Из кода на правой стороне мы можем узнать, что два подсвеченных вызова метода GetNames формируют 89.2% вызовов (экземпляров). Из-за того, что используется цикл, наверняка лучшей идеей будет вынести вызовы GetNames из цикла. Те кто изучают приложение PeopleTrax, знают, что первой оптимизацией для этого приложения является кеширование вызова GetNames в конструкторе. Следующим шагом исследования будет изменение кода, сбор новой информации профилирования и сравнения отчетов, но это я оставлю для вас.

Имейте в виду: информация уровня строк кода доступна только в режиме профилирования CPU Sampling и недоступна в режиме Instrumentation mode. Подсветка и аннотации так же недоступны в режиме Instrumentation mode.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=23756