Создание собственного профилировщика: как ловить события? - PullRequest
0 голосов
/ 25 июля 2011

Я не мог получить ответ на этот вопрос , поэтому я попытаюсь написать собственный, хотя и простой, профилировщик.Просто для начала: предположим, мне нужно выяснить, без перекомпиляции, сколько (и какое) ядро ​​выполняет мой код.Предположим также, что я хотел бы отловить, когда данная функция выполняется.Наконец, есть мысли о работе с потоками?Любые другие советы о том, как начать?C мой выбор языка, и я использую Linux.Спасибо.

Редактировать : Oprofile, CallGrind, Helgrind, gprof, papi, tau и другие, которые я проанализировал, похоже, не соответствуют моим потребностям.

Ответы [ 2 ]

2 голосов
/ 25 июля 2011

Я уверен, вы уже видели это раньше.

Я считаю полезным различать две разные цели:

  • Измерение того, сколько времени занимают разные вещи, чтобы вы могли сделать презентацию.В рамках этой презентации вы можете сказать что-то вроде: «Похоже, что процедура frob отнимает слишком много времени или вызывается слишком много раз, , предлагая , мы пытаемся ускорить это илиназывайте это меньше. "

  • Определение точных строк кода или инструкций, которые 1) не нужны и 2) заслуживают исправления в том смысле, что они сохранятхорошая доля времени выполнения.

Я подозреваю, что общая цель - последняя.Но для этого измерение является очень косвенным подходом.Вместо этого вы можете воспользоваться тем, что, если что-то тратит достаточно времени, чтобы на него посмотреть, вы можете просто поймать это , сделав снимки состояния программы.

Итак, вы 'не измерения, чтобы найти то, что занимает время.Тот факт, что на это требуется время, однозначно показывает, что не предполагает .

Zoom - профилировщик , который работает таким образом.Так же как и LTProf .Я построил один раз, но, честно говоря, я думаю, что ручной метод, в то время как больше работы, более эффективен , потому что он заставляет меня задуматься о том, почему программа делает то, что делает.

1 голос
/ 25 июля 2011

Вы должны попробовать linux perf https://perf.wiki.kernel.org/index.php/Tutorial Этот инструмент имеет прямую поддержку от ядра и знает о сбоях страниц, миграциях ЦП, переключениях контекста (например, посмотрите на вывод perf stat).Эта статистика может быть агрегирована по процессам или процессорам.perf record может использоваться как oprofile.

Для добавления вашего простого профилирования вы можете использовать setitimer (сигнал выборки в процессе) или timer_create (сигнал таймера может быть установлен для потока).Вы не можете напрямую получить информацию о физическом числе процессоров, используемом потоком, но в каждом примере вы можете рассчитать время выполнения для потока с getrusage с RUSAGE_THREAD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...