2

我需要分析几个 C 代码并获得一个带注释的文件,其中包含每行或至少每个块(while/if-else/for-functions)等所花费的执行时间百分比。

到目前为止,我已经研究了 valgrind(callgrind) 和 gperf 以及其他一些工具。到目前为止我得到的是

  • 每个函数或源代码行的计数,例如执行次数。
  • 或计数百分比。
  • 或每个函数调用所花费的执行时间。

但是,如果执行时间的百分比不是计数,那么我需要的是每行源代码或至少所有块(while/if-else/for-functions)。

有人可以让我知道我可以做到的方法吗?

谢谢,

4

2 回答 2

1

我相信perf(1)linux-tools-commonUbuntu 中软件包的一部分)会得到你想要的。它利用了一个基于内核的子系统,称为Linux 性能计数器,包含在较新的内核中。更多信息可以在这里找到。

下面的简单用法示例。确保使用调试符号进行编译。

$ perf record ./myprogram arg1 arg2
$ perf report

Cachegrind也可能值得研究。

于 2015-03-04T11:15:02.263 回答
0

如果要包含 I/O,则需要在 CPU 时间或挂钟时间对堆栈进行采样。您不需要特别高的采样频率。

每个堆栈样本都是一个代码位置列表,其中一些可以追溯到代码中的行。

一行代码的包含百分比成本只是包含它的堆栈样本数除以堆栈样本总数(乘以 100)。

这样做的用处是它告诉你如果你能摆脱那条线,你可以节省多少百分比的总时间。

唯一百分比是该行出现在末尾的样本分数。

如果一行代码在堆栈示例中出现不止一次,那仍然只是一个包含它的示例。(这需要递归。)

什么工具可以做到这一点?也许oprofile。当然Zoom

于 2015-03-04T22:41:44.273 回答