EQATECProfiler. Бесплатный профайлер для .NET

EQATECProfiler. Бесплатный профайлер для .NET

На днях искал чем можно потестировать программу, написанную на C#, в плане узких мест по производительности, и с удивлением наткнулся на бесплатный профайлер с заковыристым названием EQATECProfiler. Этот профайлер отказался очень простым в использовании и поэтому очень удобным, чтобы определить на скорую руку в каком месте программа больше всего тормозит. Официальный сайт программы расположен здесь. Там же есть ссылка на страницу скачивания. Чтобы скачать программу надо оставить свой e-mail, на который пришлют ссылку на другую страницу, с которой можно будет скачать профайлер. На вопрос о том почему разработчики сделали EQATECProfiler бесплатным, на этой странице они отвечают, что хотят понять на сколько востребован такой продукт (именно поэтому они собирают статистику скачиваний), так что не факт, что программа останется бесплатной и в будущем. Я думаю, что лучше всего показать работу EQATECProfiler’а на каком-нибудь простом примере. Пусть у нас есть такая программка на языке C#:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
 
namespace ProfTest
{
    class Program
    {
        static void Main (string[] args)
        {
            func1 ();
        }
 
        static void func1 ()
        {
            int count = 50;
 
            for (int i = 0; i < count; i++)
            {
                Console.WriteLine (i);
                Thread.Sleep (50);
                func2 ();
                func3 ();
            }
        }
 
        static void func2 ()
        {
            Thread.Sleep (100);
        }
 
        static void func3 ()
        {
            Thread.Sleep (200);
        }
    }
}

Программа представляет собой вызов функции func1(), внутри которой в цикле сначала выполняется задержка на 50 мс, а затем подряд вызываются функции func2() и func3(). Функции func2() и func3() только и делают, что вызывают задержку на 100 и 200 мс соответственно. Таким образом, один шаг цикла проходит примерно за 350 мс. В принципе, можно было бы обойтись и без цикла, но я его добавил только для большей правдоподобности, когда медленные участки кода вызываются много раз. Работает этот профайлер следующим образом. Мы указываем ему папку, где расположены скомпилированные сборки, затем EQATECProfiler их особым образом перестраивает, добавляя в найденные методы классов свои вставки и сохраняет измененные сборки в отдельную папку, которая совпадает с именем папки скомпилированной программы, но с добавлением -Profiled на конце. То есть, если мы профилируем сборки с отладочной информацией и программа у нас находится в папке Debug, то папка с обработанными профайлером сборками будет называться Debug-Profiled. Итак, компилируем эту программу и запускаем профайлер. Он не интегрируется с Visual Studio, поэтому запускать его надо отдельно. На вкладке Build выбираем папку со скомпилированной программой и EQATECProfiler сразу же увидит там наш exe’шник. Если бы были еще сборки dll, он бы их тоже заметил.

prof_01

Галками отмечаем сборки, которые мы хотим профилировать и нажимаем кнопку Build, после чего профайлер начинает обрабатывать отмеченные файлы.

prof_02

Затем переходим на вкладку Run и нажимаем на кнопку Run. Программа запускается, и ждем когда она завершится. Хотя статистику можно смотреть еще во время выполнения программы, но мы пока будем терпеливы.  В разделе View этой же вкладки показаны отчеты, которые были созданы в последнее время.

Дважды щелкаем по самому свежему отчету и попадаем на самую интересную вкладку View.

prof_03

После завершения работы программы мы получим статистику по различным методам классов. Внизу мы видим порядок вызовов функций, а красная полоска обозначает сколько времени (в процентах) программа выполняется внутри этих функций. То есть на нашем примере мы видим, что функция Main() вызывает функцию func1(), а func1(), в свою очередь, вызывает func2() и func3().

Здесь же видно, что больше всего времени (54%) при вызове func1() занимает выполнение функции func2(), func3() занимает 29%, а остальное время (17%) выполняются остальные инструкции внутри func1(). Эти проценты примерно соответствуют задержкам, которые мы добавили в каждую функцию.

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

Как видите, этот профайлер не умеет оценивать время выполнения стандартных функций и методов и не показывает только время, которое тратится на вызов других функций. Но даже это уже может помочь (и мне, кстати, уже помогло), увидеть участки кода, которые нужно оптимизировать в первую очередь.

И вообще этот простенький профайлер мне понравился.

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.

Пожалуйста, оцените запись

УжасноПлохоТак себеХорошоОтлично (Количество голосов: 5, средняя оценка: 4,00)
Загрузка...

Leave a comment

Subscribe without commenting