Pull to refresh

Обзор ASP.NET профайлеров

.NET
Почти год назад была опубликована статья об использовании профилировщика приложений в Visual Studio 2010. В комментариях была высказана мысль о том, что неплохо было бы сравнить сей продукт с аналогичными. Попробую провести краткий обзор и сравнение 4-х самых известных профайлеров .NET.

В обзоре участвуют:


Что мы ждём от профайлера? Нам нужна абсолютная (время) и относительная (проценты) статистика выполнения отдельных участков кода (если возможно, с точностью до строки). После оптимизации каких-то критичных участков кода нужно запустить профайлинг ещё раз и сравнить результаты.

Так как по роду деятельности я связан с разработкой под web, то в качестве подопытного будет выступать ASP.NET приложение (скачать):
  1. public partial class Default : System.Web.UI.Page
  2. {
  3. protected void Page_Load(object sender, EventArgs e)
  4. {
  5. SampleBadMethod1();
  6. SampleBadMethod2();
  7. }
  8. private void SampleBadMethod1()
  9. {
  10. for (int i = 0; i < 100; i++)
  11. {
  12. SampleBadSubMethod1();
  13. }
  14. }
  15. private void SampleBadSubMethod1()
  16. {
  17. Thread.Sleep(10);
  18. }
  19. private void SampleBadMethod2()
  20. {
  21. for (int i = 0; i < 10000; i++)
  22. {
  23. SampleBadSubMethod2();
  24. }
  25. }
  26. private void SampleBadSubMethod2()
  27. {
  28. Thread.Sleep(1);
  29. }
  30. }
* This source code was highlighted with Source Code Highlighter.

Небольшое лирическое отступление. Сначала хотел выбрать реальное приложение для профайлинга. Выбор пал на Tailspin Spyworks, которое используется в качестве steb-by-step руководства. Казалось бы, руководство для новичков должно быть так отполировано, чтобы сразу заинтересовать разработчика, научить каким-то правильным вещам. И что я там увидел? Кривоватую вёрстку, смесь бизнес-логики и разметки, неоптимальные запросы к БД, select * даже если тянутся 1-2 поля… Выполнять все оптимизации 4 раза (для 4-х профайлеров) оказалось очень трудоёмко, поэтому за 3 минуты было написано используемое в тестах приложение. Если кому-то интересно, в будущих статьях можно будет разобрать по косточкам Tailspin Spyworks.

Довольно лирики, запускаем профайлеры.

Visual Studio Perfomance Profiler


Запуск производится из VS через меню Analyze -> Launch Perfomance Wizard.
С помощью нескольких простых шагов выбираем тип профайлинга (я выбрал Instrumentation, т.к. в CPU sampling не показывается время выполнения, только в процентах), исследуемые проекты и нужно ли профилировать запросы к БД через ADO.NET.
После нажатия кнопки Finish запускается браузер, при этом в студии будет висеть заставка с кнопками Pause и Stop.



После окончания загрузки страницы в браузере, нажимаем Stop и получаем результат:



Не будем останавливаться на описании профайлера, это достаточно хорошо сделано тут, тут и тут.

Вот как выглядит экран статистики по методам:



Теперь нужно оптимизировать критичные участки кода SampleBadMethod1 и SampleBadMethod2. В качестве «оптимизации» сокращаем количество итераций в цикле (например, со 100 до 50 и c 10000 до 1000).
Получаем ещё раз результат и через пункт меню Analyze->Compare Perfomance Reports сравниваем результат:



Ну что же, мы молодцы, получилось ускорить наше приложение.

Повторим те же действия с другими профайлерами.

ANTS Profiler


При создании новой сессии профайлинга появляется следующее окно:



Здесь можно выбрать тип приложения, опции профайлинга и ввести данные приложения, например, для ASP.NET application на dev-сервере это путь до приложения, версия .net, номер порта и т.п.
После нажатия кнопки Start Profiling запускается браузер, в ANTS Profiler в это время рисуется график загрузки процессора по оси времени.
Нажимаем кнопку Stop Profiling и получаем результат:



Подробно рассматривать назначение и функции областей экрана сейчас не буду (это тема отдельной статьи), кратко скажу, что в верхней части видно временную шкалу с загрузкой ЦП (или любым другим показателем, который вы можете выбрать сами), в центре дерево методов со статистикой выполнения по времени и количеству вызовов, в нижней части просмотр исходного кода методов (если код доступен).
Здесь есть некоторая странность: мы видим, что суммарное время выполнения метода SampleBadSubMethod2 равно 14 мс, хотя внутри него задержка на 1 мс и он вызывается 10000 раз. Возможно, ANTS как-то некорректно обрабатывает метод Thread.Sleep.

Теперь снова «оптимизируем» приложение, запускаем профайлер, получаем результат и… не можем сравнить средствами ANTS… В FAQ на сайте предлагают запустить ещё один профайлер и переключаться между ними, сравнивая результат. Ну, спасибо, что ещё сказать :)

В бой вступает

dotTrace


При выборе File->Profile появляется окно:



Выбираем тип приложения, задаём настройки и Run!
После запуска профайлинга появляется небольшое окно, с помощью которого можно получить результат (Get Snapshot) или завершить профайлинг.



После получения результата увидим следующее окно:



Здесь видим дерево методов с процентами и временем выполнения. В правой части можно посмотреть исходник того или иного метода.
Оптимизируем приложение, получаем результат и сравниваем с первоначальным:



Ну что ж, оптимизация удалась.

И напоследок

EQATEC Profiler


Запускаем профайлер, видим окно:



Здесь нужно выбрать путь до папки bin приложения, выбрать сборки, которые хотим исследовать на нажать Build.



Затем запускаем свой любимый браузер и загружаем страницу приложения. Если всё нормально, то в логе появится надпись Profiled appication xxx started и станут активными кнопки «Take snapshot» и «Reset counters»



Далее нажимаем «Take snapshot»:



А вот и наш snapshot:



Видим статистику вызовов, а также представление методов в виде блоков (в нижней части). Эти блоки кликабельны, т.е. можно переходить по иерархии вызовов вниз/вверх.
Теперь в очередной раз оптимизируем приложение и сравниваем результат:



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

На этом всё, посмотрим на сводную таблицу возможностей представленных профайлеров

Summary


VS Profiler ANTS dotTrace EQATEC
Показ относительных результатов выполнения методов (в %) да да да да
Показ абсолютных результатов выполнения методов (в секундах, мс и т.п.) да да да да
Показ числа вызовов методов да да да да
Просмотр исходников методов да да да нет
Сравнение результатов двух замеров да нет да да
Цена > 5000$1) от 395$2) от 199$ 3) бесплатно 4)

1) в составе VS Premium и выше
2) зависит от редакции
3) для open source проектов бесплатен
4) ограничение на 10 одновременно загружаемых dll, за $ с меньшими ограничениями

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

VS Profiler

+ встроен в VS (правда, в premium и ultimate)
+ взаимодействие с ADO.NET
- капризный, иногда профайлинг не запускается без объяснения причин
- секция appSettings должна быть в web.config, а не вынесена в отдельный файл, т.к. туда пишутся какие-то служебные настройки, а разработчики видимо не предусмотрели расположение данной секции во внешнем файле
- на большом проекте и не очень мощной машине заметно подтормаживает

ANTS Profiler

+ самая подробная информация по вызовам методов, куча счетчиков производительности
- в режиме профайла SQL думает, что кроме ./SQLEXPRESS серверов больше не существует :)
- нет сравнения двух результатов замеров

dotTrace

+ больше всех понравилась документация
- в режиме просмотра дерева какая-то каша из цифр, названий методов, сборок
- не запустился в режиме IIS Application, хотя всё делал по хорошей документации.

EQATEC

+ маленький и быстрый, подходит, если не нужно смотреть производительность построчно и не нужны исходники
- данный минус — следствие плюса: меньше, чем у других конкурентов, возможностей.

Итак, сделаю, возможно, субъективный вывод. Мой выбор — EQATEC Profiler, для многих задач оценки производительности его более чем достаточно. Если у вас есть возможность использования VS Premium или Ultimate, встроенный профайлер достаточно неплохой продукт. В этом случае необходимость в покупке других профайлеров отпадёт. Из оставшихся двух профайлеров своей мощью поражает ANTS профайлер, хотя, конечно, почему нет сравнения результатов — непонятно. У dotTrace обилие вариантов приобретения с большим количеством возможностей самого профайлера.

Спасибо, что дочитали этот обзор! Надеюсь, он поможет вам сделать выбор.

P.S. Предложения по подробному обзору каждого профайлера принимаются.
Tags:.netprofilingantsdottraceeqatec
Hubs: .NET
Total votes 50: ↑41 and ↓9+32
Views17K

Popular right now