Профилирование приложений .NET с помощью секундомера

Кажется, что нет бесплатных* профилировщиков производительности .NET, которые могут профилировать на построчной основе. Поэтому я рассматриваю возможность использования секундомера для профилирования.

*бесплатно как свобода, т.е. лицензия включает коммерческие приложения.

РЕДАКТИРОВАТЬ: В ответ на тех, кто сказал мне "купить профилировщик", я бы хотел, но если бы я мог потратить столько денег, я бы потратил их на что-то другое.Я пытался убедить своего босса, что профайлер того стоит, но безуспешно. Этот вопрос в основном основан на любопытстве. Я бы никогда не рассматривал секундомер как замену настоящему профайлеру.

У меня есть небольшое тестовое приложение (написанное на C#), которое измеряет разницу в производительности при использовании секундомера для каждой строки. Тестовый код таков:

int n = 100;
BigInteger f = 1;
for (int i = n; i > 1; i--)
{
    f *= i;
}

Вот полный код: http://pastebin.com/AvbQmT32

У меня есть секундомер для каждой строки кода. Это мой «профайлер». Еще у меня есть один Секундомер на всю программу. Это мой «профайлер-профайлер».

Программа настроена на режим выпуска, любой процессор (на машине с архитектурой x64) и отключена оптимизация.

Когда я запускаю программу с отключенным профилировщиком, я получаю что-то вроде этого:

             Line             |  Ticks
------------------------------|----------
                              |
Total time:                   |       359

Когда я запускаю ее с включенным профилировщиком, я получаю что-то вроде этого:

             Line             |  Ticks
------------------------------|----------
                              |
int n = 100;                  |         3
BigInteger f = 1;             |        12
for (int i = n; i > 1; i--)   |       325
{                             |
    f *= i;                   |       539
}                             |
                              |
Total time:                   |      1710
Stopwatch overhead:           |       831

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

Теперь не всегда имеет смысл профилировать каждую строку программы, так как это обычно лучше работает с подходом «разделяй и властвуй». Обычно вы можете начать с профилирования фрагментов кода и сузить круг проблем с производительностью.

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

Тем не менее, при использовании секундомеров по-прежнему возникают накладные расходы, особенно если вы используете их часто.

Итак, ответ на вопрос:

Каков наиболее эффективный способ использования секундомеров для профилирования? Как минимизировать накладные расходы? Стоит ли вообще оборачивать секундомер вокруг одного оператора?

Спасибо за отзыв.

11
задан Kendall Frey 25 March 2012 в 01:29
поделиться