_fu2___ZSt4cout在我的C ++代码中占用了21.49%的运行时间

时间:2014-01-28 22:22:25

标签: c++ profiling gprof

我正在使用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 代表什么?

1 个答案:

答案 0 :(得分:1)

(快点:就像那样很多关于SO的问题。)

首先,gprof是“CPU分析器”。 这意味着在IO或任何其他阻塞系统调用期间,它是关闭。 你的程序可以运行100秒,在IO上花费99秒,gprof就好像只花了1秒钟。

其次,你正在看自我时间。自我时间无用,除了在不调用子功能的情况下紧缩很多的功能。 因此,如果您有一个整数数组的冒泡类型,并且您在其中花费了很大一部分时间,那么gprof会将其显示为瓶颈。 将其更改为字符串排序,其中比较需要调用函数,而gprof将在strcmp中显示较大的百分比,这不是问题所在。

从你的输出看,我的猜测是你的程序主要是做IO,所以如果在实际运行的花费的时间很少的话,它的很大一部分是进出的,这并不让我感到惊讶。库IO例程。 你还在new和迭代器中展示了很多自我时间。 一点也不奇怪。

如果您正在寻找一个分析器,您需要一个在整个分钟时间内(不是CPU时间)对整个调用堆栈进行采样,并报告每行代码在这些堆栈上出现的时间百分比。 一个这样的分析器是Zoom。 (顺便说一句,不要因为需要高频采样的线路而下降,以获得“准确度”。 如果你得到1000个样本,那就足够了,看看花了多少时间。)

当我调整性能时,我使用this method