如何使用perf测量进程中所有函数的执行时间?

问题描述 投票:0回答:1

我有一个项目,其中通过文件运行计算。我需要测量运行某个文件后调用的函数的执行时间。代码的所有功能都位于大量其他文件中。下面是我用来测量单个函数的时间的性能探针方法。如果您需要测量少量函数的时间,则此方法很容易使用,但就我而言,不同的二进制文件和文件中有很多函数,并且为每个函数创建探测事件需要很长时间。

创建一个探测事件,用于函数的入口点和出口点:

sudo perf probe -x ./binary_file_name --add func_name --add func_name%return

开始分析创建的事件:

sudo perf record -e probe_binary_file_name:func_name -e probe_binary_file_name:func_name ./a.out

因此,我可以找出 func_name 的调用次数以及每次调用的工作时间。 有没有办法为大量函数创建探测事件而无需写出所有函数的名称?

c function profiling perf time-measurement
1个回答
0
投票

有几种方法可以做到这一点:

  1. 您编写一个 [
    perl/python
    ] 脚本来解析
    .c
    文件并提取函数名称。
  2. 如果您没有某些文件的源代码,您可以对
    readelf -s
    和/或
    .o
    文件执行
    a.out
    操作,并提取标记为
    FUNC
    的名称。

对于第一种方法,您可以首先通过压头程序(例如 GNU

indent
)运行源文件。它可以将函数的返回类型强制到单独的行,并将函数名称强制到第 1 列。这使得解析变得非常容易:任何以正则表达式
^([a-zA-Z][a-zA-Z0-9]*)[(]
开头的行都将是函数名称。

此脚本可以作为

make
的一部分运行,并将名称(以您希望的 any 格式)输出到输出文件。该文件还可以包含您想要的确切
perf
参数。

© www.soinside.com 2019 - 2024. All rights reserved.