Я пытаюсь профилировать функции, предоставляемые общей библиотекой, используя sprof.
Профилирование работает, но столбец, содержащий имена функций, очень плохо отформатирован. Я использую, например, unordered_map, предоставленный boost. Соответствующая запись в плоском профиле:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls us/call us/call name
[...]
0.12 78.47 0.10 232327 0.43 _ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_
[...]
Я использовал те же команды, как описано в sprof справочная страница. Я просто изменил пути.
Весь профиль трудно читать, потому что невозможно четко увидеть пространства имен, имена классов, имена функций и т. Д.
Я попробовал небольшой пример sprof справочная страница, и это работало хорошо.
Кто-нибудь знает, почему столбец имени здесь так безобразно отформатирован?
Такие имена, как ‘_ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_’
из C ++ название искажения. Пространства имен, имена классов, аргументы шаблона, имя функции, типы аргументов функции записываются в имени. В mangling есть некоторые дополнительные функции C ++, такие как метод перегрузки для различных аргументов и шаблонов для генерации специфичного для типа кода.
Вы можете отфильтровать вывод с помощью c++filt
программа, которая разбирает большинство имен символов C ++ в кодоподобный формат C ++, читаемый человеком.
Существуют также онлайн-сервисы для разборки имен: https://demangler.com/
Он разбивает ваш символ на:
boost::unordered::unordered_map<BALL::String, BALL::String, boost::hash<BALL::String>, std::equal_to<BALL::String>, std::allocator<std::pair<BALL::String const, BALL::String> > >::unordered_map(boost::unordered::unordered_map<BALL::String, BALL::String, boost::hash<BALL::String>, std::equal_to<BALL::String>, std::allocator<std::pair<BALL::String const, BALL::String> > > const&)
или, если мы переписываем это:
boost::unordered_map<BALL::String, BALL::String...>::
unordered_map(boost::unordered::unordered_map<BALL::String, BALL::String...> const&)
или наконец — это конструктор копирования
unordered_map<String, String...>::unordered_map( unordered_map<String, String...> const&)
Других решений пока нет …