Какой профилировщик более точен: OProfile или Google Performance Tools? - PullRequest
3 голосов
/ 11 октября 2009

Я нашел двух замечательных профилировщиков:

Кто-нибудь пробовал их обоих? Что лучше?

1 Ответ

3 голосов
/ 10 ноября 2011

oprofile является более точным; он использует мониторинг производительности процессора (встроенный аппаратный мониторинг с сотнями событий производительности);

и google-perftools libprofiler.so использует setitimer - встроенный таймер ядра ОС:

$ nm -D libprofiler.so | grep timer
     U getitimer
     U setitimer

Таймер интервала эмулируется ОС, и, как я знаю, он не может быть больше HZ (100 раз в секунду, 1000 раз в секунду, 300 или 250). Я только что попробовал и 10000, и 100000, но эффективная скорость была 1000 (время выполнения программы составляет 2 секунды, и есть только ~ 2000 образцов, собранных процессором CPU из Google). Это мой ХЗ:

$ zgrep HZ= /proc/config.gz
CONFIG_HZ=1000

Не знаю, как это будет работать на ядре без галочек.

В свою очередь, oprofile использует специальное аппаратное обеспечение в ЦП, и это оборудование работает с точностью до нескольких тактов. Он может измерять, где находится ваша программа, на каждом 100000-м или 1000000-м тактах процессора, и это значение не привязано к настройке OS HZ. Кроме того, он может выполнять профилирование не только для каждого N-го такта ЦП, но также для каждого N-го пропуска L2-кэша или каждого N-го jmp неправильного прогнозирования и т. Д. В любом ЦП имеются сотни событий производительности оборудования. после Pentium Pro.

Другая лучшая сторона oprofile заключается в том, что он может профилировать что угодно, любое пользовательское приложение или все пользовательское приложение или ядро ​​и каждое приложение.

Но для использования oprofile требуется root (AFAIK), он может заморозить вашу систему при неправильном использовании; его нужно включить в ядре (когда ядро ​​было собрано).

Лучшая сторона google-perftools: проста в использовании; хорошие графические и аналитические возможности; не нужен рут для работы. Также в google-perftools есть хороший профилировщик кучи.

И oprofile, и google-perftools / cpuprofiler:

  • не нуждается в перекомпиляции приложения (как это было необходимо с gprof / gcov)
  • может нарисовать частичный callgraph (как это делается в kcachegind, например, 1 2 ; pprof даже может рисовать через kcachegrind с помощью команды callgrind)
  • будет измерять реальный профиль (не эмулируемый, как в kcachegrind / callgrind / other на основе valgrind)
  • portable (oprofile нуждается в поддержке со стороны процессора и для процессора, но он здесь для intel / amd / via / many arm; perftools будет работать везде, где он может получить callstack и попросить ОС установить setitimer)
...