用于C代码的微秒分析器

时间:2010-05-24 12:22:39

标签: c profiling profiler execution-time

有没有人知道像gprof这样的C代码分析器,它给出了以微秒而不是毫秒为单位的函数调用时间?

4 个答案:

答案 0 :(得分:3)

看看Linux perf。你需要一个非常新的内核。

答案 1 :(得分:3)

假设你有源代码,我建议我如何处理这个问题。

知道函数每次调用包含多长时间(包括I / O ),平均乘以调用次数除以总运行时间,就可以得到时间的一部分在那个功能的控制下。这一部分就是你如何知道这个函数是否是一个足以打扰优化的时间。这不是从 gprof 获得的简单信息。

了解在每个函数的控制下花费了多少包含时间的另一种方法是调用堆栈的定时或随机采样。如果函数出现在样本的X分数上(即使它在样本中出现多次),则X是它所花费的时间分数(在误差范围内)。更重要的是,这为您提供每行时间,而不仅仅是每个功能

分数X是您可以获得的最有价值的信息,因为这是您可以通过优化该函数或代码行来节省的总时间。

Zoom profiler是获取此信息的好工具。

我要做的是围绕顶级代码包装一个长时间运行的循环,以便它重复执行,足够长,至少需要几秒钟。然后我会通过随机中断或暂停来手动对堆栈进行采样。它实际上只需要很少的样本,如10或20,就可以清楚地了解最耗时的函数和/或代码行。

Here's an example.

P.S。如果你担心统计准确性,让我得到量化。如果函数或代码行恰好在50%的时间内在堆栈上,并且你需要10个样本,那么显示它的样本数将是5 +/- 1.6,误差幅度为16%。如果实际时间更小或更大,则误差范围缩小。您还可以通过采集更多样本来减少误差范围。要获得1.6%,请采集1000个样本。实际上,一旦你发现问题,由你决定是否需要较小的误差范围。

答案 2 :(得分:2)

gprof以毫秒或微秒为单位给出结果。我不知道确切的理由,但我的经验是,当它认为有足够的精度时,它将以微秒显示结果。要获得微秒输出,您需要运行程序更长时间和/或没有任何需要花费太多时间才能运行的例程。

答案 3 :(得分:1)

oprofile可以获得时钟分辨率的时间,即纳秒,它可以生成与gprof兼容的输出文件,非常方便使用。

http://oprofile.sourceforge.net/news/