C #: профилирование кода во время выполнения - какие-либо существующие библиотеки? - PullRequest
2 голосов
/ 12 ноября 2010

У меня есть приложение, в котором пользователь может соединять узлы вместе для выполнения вычислений в реальном времени.Я хотел бы иметь возможность показывать пользователю процент использования ЦП, чтобы показать, сколько используется доступного времени ЦП, и разбивку по узлам, чтобы можно было определить проблемные области.

Существуют ли доступные реализации с открытым исходным кодом для профилировщика времени выполнения, подобного этому?Я могу написать свой собственный, используя System.Diagnostics.Process.TotalProcessorTime, секундомеры / счетчики производительности, но я бы предпочел пойти с чем-то проверенным и опробованным, что может предложить мне более подробную информацию позже, если это возможно.

Редактировать: я не ищу автономного профилировщика, поскольку хочу отображать статистику в реальном времени в пользовательском интерфейсе моего приложения.

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Вы можете попробовать коммерческий GlowCode профилировщик, который имеет такую ​​функцию.

Или с открытым исходным кодом SlimTune , но он все еще находится в бета-версии.

0 голосов
/ 12 ноября 2010

Я предполагаю, что вы используете таймер, как, скажем, 10 вычислений в секунду, потому что в противном случае вы просто используете 100% ЦП (если вы также не выполняете ввод / вывод).

Можете ли выустановить прерывание будильника, чтобы оно срабатывало с некоторой разумной частотой, например, 10 или 100 Гц, независимо от того, что еще делает программа, и даже особенно во время ввода-вывода или другого заблокированного времени?

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

Вызывают ли блоки друг друга как подпрограммы?В этом случае при каждом прерывании может потребоваться захватить стек вызовов между блоками, и блок «активен», если он находится где-то в стеке, и он «хрустит», если он находится в конце стека (не в процессе вызова другого блока, и не в I / O).Затем у вас есть выбор в каждом блоке указывать процент времени, когда он «хрустит» (который не будет превышать 100% при суммировании по блокам) или «активен» (который, вероятно, будет превышать 100% при суммировании по блокам).

Значение последнего числа в том, что оно не говорит вам так много «где» время потрачено, оно говорит вам «почему».Это может ответить на такие вопросы, как «Я вижу, что foo занимает много времени, но как я получил там ?»То же самое для ввода / вывода.Это тоже процесс, он просто происходит на другом оборудовании.Вы не хотите игнорировать это, потому что если вы это сделаете, вы можете в конечном итоге сказать: «Почему я использую только небольшую часть процессора? Что за задержка?»

...