我想提高大型应用程序中特定方法的性能。
目标是改善延迟(在特定功能上花费的挂钟时间),而不是(必然)系统负载。
要求:
- 由于我预计很多延迟是由 I/O 引起的,请考虑等待/阻塞所花费的时间(换句话说:查看挂钟时间而不是 CPU 时间)
- 由于该程序比我要优化的片段做得更多。需要有一种方法可以以编程方式启动/停止分析,或者过滤输出以仅显示进入和退出我正在优化的函数之间的时间。
- 方法级别的分析是可以接受的(如果可以在指令级别完成,那就更好了。如果它只分析系统调用,那可能还不够)
- 这是一个爱好项目,所以昂贵的工具并不是一个真正的选择
- 仪器(-finstrument-functions)是可以接受的
- 我感兴趣的关键代码很难手动中断(因为它已经相对较快并且很难在循环中实际调用),因此某种自动化是必要的。
迄今为止丢弃的工具:
- gprof、oprofile、callgrind(要求 1)
- 使用 getrusage 构建自定义内容(要求 1)
- Poormansprofiler.org(要求 2)
- strace -T,dtrace,http ://perf.wiki.kernel.org (要求 2 和 3)
- VTune,Zoom(要求 4)
- 手动调用堆栈采样(要求 6)
- google-perftools (应该能够测量挂墙时间,但这在我的情况下似乎不起作用,大概是因为 SIGALRM 干扰。
- systemtap(我的内核没有打补丁以包含 utrace)
我尚未进一步评估的其他选项:
- cprof (不是开箱即用的,似乎仅限 i386)
- 手动插入跟踪点(例如使用 lttng)
我很想听听:
- 其他选项
- 也许我过早地丢弃了一些工具?
- 我尚未评估的选项是否有机会发挥作用,如果有,如何最好地做到这一点。
我终于安顿下来了:
这个粗糙的工具产生的痕迹很难解释,我可以很容易地想象一些工具可以进一步处理它的输出,让它变得无限有用。但是,这暂时为我完成了这项工作,所以我将这个项目推迟到以后;)。