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