Обзор ASP.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.  
    9.     private void SampleBadMethod1()
    10.     {
    11.       for (int i = 0; i < 100; i++)
    12.       {
    13.         SampleBadSubMethod1();
    14.       }
    15.     }
    16.  
    17.     private void SampleBadSubMethod1()
    18.     {
    19.       Thread.Sleep(10);
    20.     }
    21.  
    22.     private void SampleBadMethod2()
    23.     {
    24.       for (int i = 0; i < 10000; i++)
    25.       {
    26.         SampleBadSubMethod2();
    27.       }
    28.     }
    29.  
    30.     private void SampleBadSubMethod2()
    31.     {
    32.       Thread.Sleep(1);
    33.     }
    34.   }
    * 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. Предложения по подробному обзору каждого профайлера принимаются.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 11

      0
      Большое спасибо за обзор профайлеров!!! Я даже и не знал про EQATEC Profiler. Думаю завтра же попробую поиграться с ним
        +1
        1) возможно, плохо искал
        Ага, плохо:
          0
          А вроде там нельзя одновременно увидит сколько раз был вызван метод и сколько на это было потрачено времени. Т.е. можно видит либо то, либо другое. У ANTS в этом смысле все отлично. С остальными не работал, так что про них сказать не могу.
            0
            Можно, оно в той же табличке есть, выбиратся в Add/Remove Columns. Хотя я не считаю, что это очень удобно.
            Мне больше нравится, как у dotTrace. Или ANTS, да.
            0
            Спасибо. А как увидеть, что SampleBadSubMethod2 вызывался 10000 раз?
              0
              Она эту функцию скрыла, чтобы не мозолить глаза читателю. Если в неё добавить простейший цикл, она появится.
              Или, чтобы увидеть её, такую как она есть, снимите галку «Exclude small functions from instrumentation», в настройках профайлинга (Performance Explorer -> Targets ->… -> Properties -> Instrumentation).
                0
                Ещё раз благодарю, поправил
            0
            Мой выбор: если надо оптимизировать код, который не связан с БД, то это ANTS, если с БД то VS Profiler.
            Удобнее, чем у ANTS пока я не видел отчетов. Большой там плюс в том, что можно выделить участок, и увидит критические точки. А профайлер VS имеет много возможностей, но пока толку от этого пока мало.
              –1
              Поддерживаю! RedGate рулит.

              Непонятно только, причем тут ASP.NET.
                0
                >Здесь есть некоторая странность: мы видим, что суммарное время выполнения метода
                >SampleBadSubMethod2 равно 14 мс, хотя внутри него задержка на 1 мс и он вызывается 10000 раз.

                сдается мне там 14 тысяч.
                  0
                  EQUATEC, похоже, был куплен телериком, и теперь нормально платный.

                  Only users with full accounts can post comments. Log in, please.