Visual Studio

индекс
38,32

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.

Progg it
_________
Текст подготовлен в ХабраРедакторе
+33
20 января 2010, 14:05
38

комментарии (22)

+1
basilkot #
Спасибо, хорошая статья.
2010-ая студия радует своими возможностями.
+1
Sone #
Вот это действительно удобно:) Жаль для java такого нет:(
+1
Sone #
Уважаемые господа минусующие аргументируйте, очень интересно вас послушать
+1
chaZmich #
Заранее прошу прощения за возможно глупый вопрос.
Профилирование подобным образом применимо для веб разработки (asp.net)?

кстати статья интересная на мой личный взгляд. Ну как минимум как человека не использующего профилирование ранее :)
+1
XaocCPS #
>> Профилирование подобным образом применимо для веб разработки (asp.net)?

конечно, вот экран выбора типа проекта профилирования

0
chaZmich #
Еще и JS. Совсем здорово
Спасибо
0
ashmind #
Всё конечно интерсно, но почему перевод?
Разве у нас нет человека который может это посмотреть и рассказать свои личные впечатления?

Сравнить с dotTrace и ANTS, хотя бы.
+3
XaocCPS #
займетесь? :-)
0
ashmind #
Времени не хватает, к сожалению, ещё в свой блог N постов в очереди.

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

Потому что так в двух местах одно и то же, а так и там и там узнаю новое.
0
xander_unlim #
будем благодарны хотя-бы за перевод.
хотя хотелось-бы конечно и сравнения с другими продуктами
0
feci #
Спасибо, полезная информация.
+3
Mad_Fish #
Вот почему практически всё внимание разработчиков студии, начиная ещё где-то с 2003 версии, уходит на C#?

А вот для С++ 2008 == 2005 == 2003 == 6.0 (ну почти равно) по реальным возможностям. Может хоть в 2010 что-то сделают новое.
+4
XaocCPS #
я вас, наверное, обрадую: все что здесь описано применимо к проектам (всех типов) на С++ в полной мере

Image downloaded service ITmages
0
Indalo #
Супер!
+1
CLR #
Супер конечно, но в любом случае гораздо эффективнее использовать Intel VTune + PTU, невероятно если MS сможет их заменить (хотя хотелось бы конечно).
+7
tangro #
Название приложения («PeopleTrax») вызвало широкую улыбку.
+1
Gumanoid #
В этом отчете я смотрю на горячий след (Hot Path) и вижу, что метод People.GetNames вызывается двумя горячими функциями StringReader.ReadLine() и String.Trim().

Скорее, наоборот.
0
XaocCPS #
fixed, спасибо
0
eyeofhell #
И в каких редакциях студии будут такие удобства? Express, Standard, Professional, Team?
0
utk #
Будут в Premium ($5,469) и Ultimate ($11,899).
В Professional — нет.
0
pwl #
хм…
т.е. в профайлере появились графики. ну это да. прорыв.
а что насчет поддержки процессорных event-counter-ов?
например FPU-exceptions, из-за которых мне пару дней назад пришлось скачивать codeanalyst?
(вы знаете дрегой способ поиска операций с денормализованными операндами?)
0
utk #
В Professional-версии профайлера нет? Только в Premium? Интересное кино…

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.