2010-09-10 2 views
2

Я искал профилировщик выборки Linux, и callgrind пришел ближе всего, чтобы показать полезные результаты. Однако накладные расходы оцениваются в 20--100x slower than normal. Кроме того, меня интересует только время, затрачиваемое на каждую функцию (с особым упором на блокировку вызовов, таких как read() и write(), которые не будут отображаться никаким другим профилировщиком).Использовать callgrind в качестве профайлера пробоотбора?

  1. Есть ли способ отключить избыточные параметры, чтобы записывать минимальные данные для генерации времени, потраченного на различные стеки вызовов?
  2. Является ли наследие кэшхринджем callgrind подразумевающим, что избыточный материал выполняется в отношении профилирования кеша и т. Д.?
  3. Я предполагаю, что callgrind работает как отладчик. Можно ли это отрегулировать, чтобы выборочно обрабатывать процесс, а не каждую отдельную инструкцию?

ответ

0

Вы пробовали gprof? У него нет больших накладных расходов, как это делает valgrind.

+2

К сожалению, gprof не выполняет выборку, он _only_ подсчитывает _CPU_ время для инструментальных функций. (Не стесняйтесь исправлять меня, если вы знаете лучше, но это то, что я понимаю). –

+0

http://sourceware.org/binutils/docs/gprof/Implementation.html#Implementation «Профилирование также подразумевает просмотр вашей программы по мере ее запуска и сохранение гистограммы того, где встречается счетчик программ, время от времени."- поэтому гистограмма из gprof на самом деле представляет собой профиль выборки pc – osgx

+0

http://sourceware.org/binutils/docs/gprof/Flat-Profile.html#Flat-Profile - Плоский профиль основан в основном на выборке.' gprof -p ', первые два столбца. – osgx

1

3) Callgrind работает как динамический транслятор, который устанавливает исходный код прибора с кодом счетного инструмента. Инструментарий выполняется для каждой инструкции доступа к памяти в коде (для моделирования кэша) и (я предлагаю) для каждой команды, подобной jmp, для отслеживания exec. подсчет каждого базового блока.

У меня есть небольшой профилировщик пробоотбора, который действует как отладчик; Он вводит в приложение setitimer() профилирующий счетчик и затем перехватывает все SIGALRM и печатает текущее значение $eip.

Были некоторые пробоотборники выборки с приближением setitimer, также есть profil() для чего-то вроде. Это используется glibc/gmon/gmon.c и gprof -p (точнее, gcc -pg). profil() функция способна проецировать одиночный фрагмент фрагмента фрагмента с выборкой времени виртуального процессора каждые 1 или 10 миллисекунд. Существует также функция sprofil().

Проверьте также LD_PRELOAD =/Библиотека/libpcprofile.so PCPROFILE_OUTPUT = output.file - но я не знаю, это работает и как это работает

Для пронумерованных вопросы:

2) «Callgrind является расширение Cachegrind. Оно предоставляет всю информацию, которую делает Cachegrind, а также дополнительную информацию о callgraphs. " - Так что он может обеспечить любой материал, который находится в похожем на Cachegrind, но и позволяет пользователю отключить моделирование кэша: --simulate-cache=no (это значение по умолчанию)

Для скорости: По http://www.valgrind.org/docs/manual/nl-manual.html - руководство по Нул инструмента VALGRIND (ака nulgrind), что не требует дополнительного инструментария, замедление составляет 5 раз. Это потому, что программа динамически переводится самой valgrind. Таким образом, не может быть никакого инструмента для valgrind, который может работать быстрее, чем nulgrind.

+0

Вот активация gmon http://stackoverflow.com/questions/2279754/profiling-a-c-or-c-based-application-that-never-exits/2280519#2280519 – osgx

0

Попробуйте использовать Zoom с помощью RotateRight. Он имеет конфигурацию «Время потока», которая отображает все потоки в одном процессе независимо от того, запущены или заблокированы ли они.

+0

Да, но $ 399. Конечно, это лучший продукт, доступный для моих целей, но не для программирования хобби. –

Смежные вопросы