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