【发布时间】:2011-01-27 19:05:19
【问题描述】:
短版:
是否有适用于 Linux 的基于时间的采样分析器?
长版:
我通常使用OProfile 来优化我的应用程序。我最近发现了一个令我疑惑的缺点。
问题是一个紧密的循环,产生了 c++filt 来破坏 c++ 名称。我只是在寻找另一个瓶颈时偶然发现了代码。 OProfile 没有显示代码有任何异常,所以我几乎忽略了它,但我的代码感觉告诉我优化调用并查看发生了什么。我把c++filt的popen改成了abi::__cxa_demangle。运行时间从一分钟多到一秒多一点。大约 x60 加速。
有没有办法配置 OProfile 来标记 popen 调用?由于配置文件数据现在存在,OProfile 认为瓶颈是堆和 std::string 调用(顺便说一句,它曾经优化过将运行时间降低到不到一秒,超过 2 倍的速度)。
这是我的 OProfile 配置:
$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536
是否有另一个 Linux 分析器可以找到瓶颈?
我怀疑问题在于 OProfile 仅将其样本记录到当前运行的进程中。我希望它始终将其样本记录到我正在分析的过程中。因此,如果进程当前被关闭(阻塞 IO 或 popen 调用)OProfile 只会将其样本放在被阻塞的调用中。
如果我不能解决这个问题,OProfile 只有在可执行文件接近 100% CPU 时才有用。对于阻塞调用效率低下的可执行文件,它无济于事。
【问题讨论】:
标签: c++ profiling popen oprofile