我已经习惯于在gdb中随机暂停一个正在运行的程序,以了解它花费时间的位置,如How can I profile C++ code running in Linux?中所述。与交互式/实时系统相比,这种技术似乎最适合批处理。
对于我目前正在处理的程序,绝大多数样本都在epoll_wait()中。这显然不是加速的候选者,但我想知道其他性能瓶颈是什么。
理想情况下,当线程未被epoll_wait()阻塞时,我希望从这些时间间隔生成多个堆栈跟踪(连同参数和环境)。
有没有人知道这样做的好方法,还是应该咬紧牙关并转而使用探查器?
答案 0 :(得分:0)
对于我目前正在开展的项目,绝大多数是 样本在epoll_wait()中。这显然不是一个候选人 加速,但我想知道其他性能瓶颈是什么 是
我认为你可以使用poor man's profiler。
在它的输出中,您应该会在顶行看到折叠的堆栈跟踪epoll_wait
。您已经知道它不是代码中的瓶颈因此您应该跳过它并查看下一行输出以查看更合适的优化候选项。
答案 1 :(得分:-1)
我在UI程序中使用随机暂停。我在调试器下运行整个事情,只在需要时间时暂停它,即当我等待它时。
如果你看到它在epoll_wait
登陆,那么调用堆栈应该说明它为什么要等待。
有可能它正在做你可能避免的I / O吗?
如果你无法避免I / O,你只需要一个I / O绑定程序。
我见过的那种事情是在应用程序启动期间,似乎需要很长时间。 堆栈样本经常显示加载插件的深度为30+级。 如果我读取堆栈,我会看到,作为加载插件的一部分,它从dll中提取字符串资源,以获取插件的名称,然后根据其所在的国家/地区进行翻译。 这样做的原因是它可以绘制一个字符串,例如“Loading Plugin FooBar”,这样用户就会知道为什么这么长时间。
它可以将启动时间增加2倍,这样就可以告诉用户为什么它的速度很慢!
毋庸置疑,解决这个问题并不难......
其他问题类似。 注意:只要了解功能占用的时间,即使是挂钟时间,您也无法获得任何这种洞察力。 这是暂停和任何其他分析方法之间的区别。 它告诉你为什么,没有它,你无法判断活动是否是不必要的。