我尝试使用sprof来分析共享库提供的功能。 分析工作,但包含函数名称的列格式非常难看。我正在使用例如boost提供的unordered_map。平面轮廓中的相关条目是:
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手册页的小例子,效果很好。
有谁知道为什么名称列在这里如此难以格式化?
答案 0 :(得分:1)
名称如'_ZN5boost9unordered13unordered_mapIN4BALL6StringES3_NS_4hashIS3_EESt8equal_toIS3_ESaISt4pairIKS3_S3_EEEC1ERKSC_' 来自C ++ name 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&)
或最后 - 它是copy constructor
unordered_map<String, String...>::unordered_map( unordered_map<String, String...> const&)