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

标签 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 代表什么?

最佳答案

(快点:关于 SO 的问题有很多。)

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

其次,您正在查看自用时间。自用时间没用,除了那些在不调用子函数的情况下处理很多的函数。 因此,如果您有整数数组的冒泡排序,并且您在其中花费了大部分时间,gprof 会将其显示为瓶颈。 将其更改为对字符串进行排序,其中比较需要调用函数,并且 gprof 将在 strcmp 中显示一个很大的 %,这根本不是问题所在。

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

如果您正在寻找一个分析器,您需要一个能够在挂钟时间(而不是 CPU 时间)对整个调用堆栈进行采样并报告每行代码出现在这些堆栈上的时间百分比的工具。 一个这样的分析器是 Zoom . (顺便说一句,不要误以为您需要高频样本才能获得“准确性”。 如果您获得 1000 个样本,这就足够了,看看什么需要时间。)

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

关于c++ - _fu2___ZSt4cout 在我的 C++ 代码中占用了 21.49% 的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21418179/

相关文章:

c++ - 使用自动工具检查预编译头文件?

c++ - 可以使用带有 boost 的 C++ 匿名函数吗?

python-requests:是否可以绕过 HTTPS 以提高速度

c++ - gprof - 文件缺少调用图数据

C++ 函数包装器

c++ - "new operator"将另一个类实例化为工厂?

php - 找出您的 PHP 代码在哪里变慢(性能问题)

java - Thread.sleep 和 BufferedReader.readLine 在我的 java tcp 服务器中使用最多的 cpu 周期。为什么?

c - 从 gprof 结果中排除函数

c++ - 如何将 gprof 与 autotools 一起使用?