короткая версия:
Существует ли хороший основанный на времени профилировщик выборки для Linux?
долгая версия:
Я обычно использую OProfile для оптимизации моих приложений. Я недавно нашел недостаток, который имеет меня удивление.
Проблемой был жесткий цикл, порождая C++ filt к demangle имя C++. Я только наткнулся на код случайно при упорно искании другого узкого места. OProfile не показал ничего необычного о коде, таким образом, я почти проигнорировал его, но мой смысл кода сказал мне оптимизировать вызов и видеть то, что произошло. Я изменился popen
из C++ filt к 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 или a popen
звоните), OProfile просто поместил бы свой образец при заблокированном вызове.
Если я не могу зафиксировать это, OProfile только будет полезен, когда исполняемый файл продвинет близкие 100% ЦП. Это не может помочь с исполняемыми файлами, которые имеют неэффективные вызовы блокирования.
Рад, что вы спросили. Я считаю, что OProfile можно заставить делать то, что я считаю правильным, а именно брать образцы стека по времени настенных часов , когда программа работает медленно , и, если это не позволяет вам исследовать отдельный стек образцы, по крайней мере, суммируйте для каждой строки кода, которая появляется в образцах, процент образцов, на которых появляется строка. Это прямая мера того, что было бы сохранено, если бы этой строки не было. Вот одно обсуждение. Вот еще один, и еще один . И, как сказал Пол, Zoom должен это сделать.
Если ваше время увеличилось с 60 до 1 секунды, это означает, что каждая отдельная выборка стека имела бы 59/60 вероятность показать вам проблему.
Попробуйте Zoom - я считаю, что это позволит вам профилировать все процессы - было бы интересно узнать, выделяет ли он вашу проблему в этом случае.