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

Posted

技术标签:

【中文标题】_fu2___ZSt4cout 在我的 C++ 代码中占用了 21.49% 的运行时间【英文标题】:_fu2___ZSt4cout is taking 21.49% of the running time in my C++ code 【发布时间】:2014-01-28 22:22:24 【问题描述】:

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

【问题讨论】:

可能是一个错位的cout @JaimeCervantes:程序运行多长时间?如果它很短,我可以想象它与 I/O 子系统的构造/销毁有关。 良好的写入通常发生在内存缓冲区中,不确定是否有优化将其包装在 C++ 中的某种形式的 cout 中。您是否尝试注释掉调用cout 的行并查看它是否改变? @JaimeCervantes:当你说“std write()”时,你的意思是std::ostream::write()?如果是这样,它不会真正与std::cout 相关,而是与 iostream 子系统相关。您可能需要确保您使用的是C 语言环境。确保您不要意外地不断刷新流,例如,使用std::unitbufstd::flush 等。 我相信_fu2___ZSt4cout 包括main。可能您缺少调试信息? 【参考方案1】:

(快速点:so 有很多这样的问题。)

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

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

通过查看您的输出,我猜您的程序主要执行 IO,因此如果在实际运行所花费的少量时间中,其中很大一部分是进入和退出的,我并不感到惊讶库 IO 例程。 你还在new 和一个迭代器中展示了很多自我时间。 一点也不奇怪。

如果您正在寻找一个分析器,您需要一个在挂钟时间(而不是 CPU 时间)对整个调用堆栈进行采样并报告每行代码出现在这些堆栈上的时间百分比的分析器。 一个这样的分析器是Zoom。 (顺便说一句,为了获得“准确性”,请不要选择需要高频样本的线路。 如果您获得 1000 个样本,这已经绰绰有余,看看需要花费什么时间。)

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

【讨论】:

以上是关于_fu2___ZSt4cout 在我的 C++ 代码中占用了 21.49% 的运行时间的主要内容,如果未能解决你的问题,请参考以下文章

__int64 在 32 位机器上?

使用 Boost 库 Qt C++ 更新翻译文件

未找到在 C++ 'python33_d.lib' 中使用 Python 3.3

使用boost.python,如何扩展类的__dir__函数?

__AVX2__ 似乎没有在 eclipse-cdt 中定义

大数据技术之_03_Hadoop学习_02_入门_Hadoop运行模式+本地运行模式+伪分布式运行模式+完全分布式运行模式(开发重点)+Hadoop编译源码(面试重点)+常见错误及解决方案(示例代(代