Снова для демонстрации я буду использовать приложение 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). Немного меньшая высота секции.
- и другие функции с меньшим числом экземпляров.
Изучив код я не могу найти простого решения для его упрощения, я не могу контролировать работу Trim() или ReadLine(), так что давайте перейдем на один уровень выше в вызывающих функциях, щелкнув на GetPeople (это единственная функция, которая вызывает наш метод GetNames — прим. перев.).
Нажатие на GetPeople приводит к переходу на детали для данной функции:
Из кода на правой стороне мы можем узнать, что два подсвеченных вызова метода GetNames формируют 89.2% вызовов (экземпляров). Из-за того, что используется цикл, наверняка лучшей идеей будет вынести вызовы GetNames из цикла. Те кто изучают приложение PeopleTrax, знают, что первой оптимизацией для этого приложения является кеширование вызова GetNames в конструкторе. Следующим шагом исследования будет изменение кода, сбор новой информации профилирования и сравнения отчетов, но это я оставлю для вас.
Имейте в виду: информация уровня строк кода доступна только в режиме профилирования CPU Sampling и недоступна в режиме Instrumentation mode. Подсветка и аннотации так же недоступны в режиме Instrumentation mode.