Кажется, что нет бесплатных* профилировщиков производительности .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
В идеале время, затраченное на код, должно быть равно в обоих случаях, но кажется, что у секундомеров есть служебные данные, которые появляются в течение их собственного прошедшего времени.
Теперь не всегда имеет смысл профилировать каждую строку программы, так как это обычно лучше работает с подходом «разделяй и властвуй». Обычно вы можете начать с профилирования фрагментов кода и сузить круг проблем с производительностью.
Кроме того, в большинстве приложений средняя строка кода будет намного медленнее, чем в тестовой программе. Это означает, что будет меньше накладных расходов на секундомер.
Тем не менее, при использовании секундомеров по-прежнему возникают накладные расходы, особенно если вы используете их часто.
Итак, ответ на вопрос:
Каков наиболее эффективный способ использования секундомеров для профилирования? Как минимизировать накладные расходы? Стоит ли вообще оборачивать секундомер вокруг одного оператора?
Спасибо за отзыв.