короткая версия:
Есть ли подходящий профилировщик выборки на основе времени для Linux?
длинная версия:
Я обычно использую OProfile для оптимизации своих приложений. Недавно я нашел недостаток, который заставляет меня задуматься.
Проблема заключалась в том, что в цикле создавался фильтр на C ++, чтобы разобрать имя на C ++. Я только случайно наткнулся на код, когда преследовал другое узкое место. OProfile не показывал ничего необычного в коде, поэтому я почти проигнорировал его, но мой смысл кода подсказал мне оптимизировать вызов и посмотреть, что произошло. Я изменил popen
с ++ фильтра на abi::__cxa_demangle
. Время выполнения увеличилось с более минуты до чуть более секунды. Примерно в 60 раз быстрее.
Есть ли способ, которым я мог бы настроить OProfile для отметки вызова popen
? Поскольку данные профиля теперь хранятся, OProfile считает, что «горлышком бутылки» была куча, и std::string
вызовов (которые, кстати, однажды оптимизированные, сократили время выполнения до менее чем за секунду, более чем в 2 раза быстрее).
Вот моя конфигурация OProfile:
$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536
Есть ли другой профилировщик для Linux, который мог бы найти узкое место?
Я подозреваю, что проблема в том, что OProfile записывает только свои образцы в текущий запущенный процесс. Я бы хотел, чтобы он всегда регистрировал свои образцы в процессе, который я профилирую. Поэтому, если процесс в данный момент отключен (блокировка ввода-вывода или вызов popen
), OProfile просто поместит свою выборку в заблокированный вызов.
Если я не могу это исправить, OProfile будет полезен только тогда, когда исполняемый файл загружает процессор почти на 100%. Это не может помочь с исполняемыми файлами с неэффективными блокирующими вызовами.