короткая версия:
Есть ли хороший профилировщик выборки для свободного времени для Linux?
длинная версия:
Я обычно использую OProfile для оптимизации моих приложений. Недавно я нашел недостаток, который меня озадачил.
Проблема заключалась в сложном цикле, порождающем С++ filter, чтобы развернуть имя С++. Я случайно наткнулся на код, преследуя еще одно узкое место. OProfile не показал ничего необычного в коде, поэтому я почти проигнорировал его, но мой смысл кода подсказывал мне оптимизировать вызов и посмотреть, что произошло. Я изменил popen
фильтра С++ на abi::__cxa_demangle
. Среда длилась от минуты до нескольких секунд. Около x60 ускоряется.
Есть ли способ, которым я мог бы настроить OProfile для обозначения вызова popen
? Поскольку данные профиля находятся сейчас, OProfile считает, что шея бутылки была кучей и std::string
вызовов (которые BTW после оптимизации уменьшали время выполнения до менее секунды, больше, чем x2).
Вот моя конфигурация 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 только регистрирует свои образцы в текущем запущенном процессе. Я бы хотел, чтобы он всегда записывал свои образцы в процесс, который я профилирую. Поэтому, если процесс в настоящее время отключен (блокировка на вызове IO или popen
), OProfile просто поместил бы свой образец на заблокированный вызов.
Если я не могу исправить это, OProfile будет полезен только тогда, когда исполняемый файл нажимает около 100% CPU. Он не может помочь с исполняемыми файлами, которые имеют неэффективные блокирующие вызовы.