我正在使用gprof来优化我的C ++代码,并且我获得了以下结果:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
21.49 2.31 2.31 _fu2___ZSt4cout
12.93 3.70 1.39 1560037 0.00 0.00 __gnu_cxx::new_allocator<DataINSPVAS>::construct(DataINSPVAS*, DataINSPVAS const&)
8.56 4.62 0.92 30267700 0.00 0.00 __gnu_cxx::new_allocator<AntennaData>::construct(AntennaData*, AntennaData const&)
6.14 5.28 0.66 261159927 0.00 0.00 __gnu_cxx::__normal_iterator<char*, std::string>::__normal_iterator(char* const&)
5.40 5.86 0.58 149234244 0.00 0.00 bool __gnu_cxx::operator!=<char*, std::string>(__gnu_cxx::__normal_iterator<char*, std::string> const&, __gnu_cxx::__normal_iterator<char*, std::string> const&) ...
根据此平面配置文件, fu2 __ ZSt4cout 功能占用了21.49%的运行时间。有谁知道 fu2 __ ZSt4cout 代表什么?
答案 0 :(得分:1)
(快点:就像那样很多关于SO的问题。)
首先,gprof
是“CPU分析器”。
这意味着在IO或任何其他阻塞系统调用期间,它是关闭。
你的程序可以运行100秒,在IO上花费99秒,gprof
就好像只花了1秒钟。
其次,你正在看自我时间。自我时间无用,除了在不调用子功能的情况下紧缩很多的功能。
因此,如果您有一个整数数组的冒泡类型,并且您在其中花费了很大一部分时间,那么gprof
会将其显示为瓶颈。
将其更改为字符串排序,其中比较需要调用函数,而gprof
将在strcmp
中显示较大的百分比,这不是问题所在。
从你的输出看,我的猜测是你的程序主要是做IO,所以如果在实际运行的花费的时间很少的话,它的很大一部分是进出的,这并不让我感到惊讶。库IO例程。
你还在new
和迭代器中展示了很多自我时间。
一点也不奇怪。
如果您正在寻找一个分析器,您需要一个在整个分钟时间内(不是CPU时间)对整个调用堆栈进行采样,并报告每行代码在这些堆栈上出现的时间百分比。 一个这样的分析器是Zoom。 (顺便说一句,不要因为需要高频采样的线路而下降,以获得“准确度”。 如果你得到1000个样本,那就足够了,看看花了多少时间。)
当我调整性能时,我使用this method。