【发布时间】:2014-05-08 06:07:16
【问题描述】:
我有这个用 C 编写的应用程序,应该对其进行调整以提高性能。我查看了一些 Linux 中可用的性能分析器,发现 GNU 分析器,valgrind 就是其中的一部分。问题是它们都只提供功能级别的分析信息,而不是我需要的语句级别的分析。有什么工具可以提供这些信息。
【问题讨论】:
标签: c linux performance profiling
我有这个用 C 编写的应用程序,应该对其进行调整以提高性能。我查看了一些 Linux 中可用的性能分析器,发现 GNU 分析器,valgrind 就是其中的一部分。问题是它们都只提供功能级别的分析信息,而不是我需要的语句级别的分析。有什么工具可以提供这些信息。
【问题讨论】:
标签: c linux performance profiling
使用-g 编译代码以获取调试符号,并使用-O0 编译代码,这样优化器就不会打乱代码。
然后在 GDB 调试器下运行它,当它运行缓慢时,通过键入 Ctrl-C 来中断它。
它将在另一个线程上停止,因此键入thread 1 以进入活动线程。
然后键入bt 以显示调用堆栈。
仔细查看它,了解它在做什么,为什么它在做,什么时候停止。
这样做几次,您就会非常准确地了解它是如何花费时间的。 这就是random pausing 技术,如果你通过那里的cmets,你会看到它的效果如何。 另外,FWIW,我发了一个short video of it。
正如您所指出的,大多数分析器不会为您提供行级信息。我知道一个给你a)行级信息,b)包含时间(“自我时间”几乎没用),c)挂钟时间(所以你不是对 I/O 视而不见)是Zoom。 也许其他人可以做到,我不确定。
即使分析器为您提供了所有这些,它也为您提供了宝贵的少量上下文,而上下文是您需要能够识别何时所花费的时间实际上是您可以摆脱的东西。 随机暂停为您提供完整的上下文。 它让您的大脑识别正在发生的事情,最重要的是为什么,而不是仅仅为您提供数字或图形摘要,并希望这足以找到加速。
当您尽可能挤出每个循环后,您仍然会看到很大一部分样本在编译器编译的代码中终止,然后打开 -O3 并让优化器完成它的工作。
【讨论】:
【讨论】: