gpt4 book ai didi

c - 使用 gprof 的奇怪分析输出

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:55 24 4
gpt4 key购买 nike

我目前正在使用 gprof 分析我的代码,该代码符合 C99。 我的程序是递归定义的。我正在使用带有 -pg 标志的 gcc 进行编译,启用了一些警告,但没有优化标志。然后我运行代码后跟命令:

gprof ./myProgram > outputFile.txt

不过,我对输出告诉我的内容感到非常困惑。它是说我在一个我知道我并没有花很多时间的函数上花费了很多时间。有问题的函数内部有一个循环并执行一个任务一定次数。不过,这是一项很小的任务,通过将完成任务的次数从 5 次增加到 100 次,我的程序执行总时间没有明显变化。然而,gprof 告诉我,我几乎 50% 的执行时间都花在了这个函数上。

我不知道这里有什么问题。有没有人遇到过这样的事情?我可以自己解决这个问题吗?我正在使用 Linux 的 CentOS 发行版。我尝试将 OProfile 安装为不同的分析器,但没有对/usr/local 的写入权限,因此 make install 失败,所以不确定这是否只是 gprof 的问题

这里是输出文件的相关部分。奇怪的输出是函数 nl_jacobi_to_converge:

从我的平面资料来看

  %   cumulative   self              self     total           
time seconds seconds calls s/call s/call name
49.02 7.50 7.50 1562 0.00 0.01 calculate_resid_numeric_jac_diags_tc41
16.41 10.01 2.51 323878716 0.00 0.00 c
14.97 12.30 2.29 323878716 0.00 0.00 b
6.01 13.22 0.92 89 0.01 0.02 calculate_resid_tc41
5.69 14.09 0.87 10967082 0.00 0.00 rhs_function
1.11 14.26 0.17 1562 0.00 0.00 single_nl_jacobi
...
0.00 15.30 0.00 11 0.00 0.76 nl_jacobi_to_converge

从我的粒度来看

index % time    self  children    called     name
0.00 8.32 11/11 nl_multigrid [3]
[5] 54.4 0.00 8.32 11 nl_jacobi_to_converge [5]
5.28 2.92 1100/1562 calculate_resid_numeric_jac_diags_tc41 [4]
0.12 0.00 1100/1562 single_nl_jacobi [17]

最佳答案

您是无数人中的一员,他们试图弄清楚 gprof 告诉他们的是什么,精确到小数点后四位。 I use random pausing and examining the stack.

首先,gprof 是一个“CPU 分析器”。这意味着在 IO、互斥锁、分页或任何其他阻塞系统调用期间,它会关闭,并且不计算那个时间。你说你什么都没做,但它可能发生在某些库函数的深处。如果是,gprof 会屏蔽它。另一方面,单个堆栈样本将显示它正在等待什么,概率等于它等待的时间的一部分。

其次,正如@keshlam 所说,了解“ self 时间”很重要。如果它很高,则意味着在该例程中发现程序计数器占据了 CPU 时间的很大一部分。但是,如果它很低,并不意味着该功能没有问题。该函数可能花费很多 时间,但通过调用子函数来完成。要看到这一点,您需要 gprof“总计”列,但它是总时间的百分比,而不是每次调用的绝对时间,这是它为您提供的。如果你取一个堆栈样本,那么任何例程都会出现在它上面的概率等于它花费的时间的分数。更重要的是,您会确切地知道为什么要花费这段时间,因为示例会向您显示调用发生的精确行号。

添加:gprof 尝试处理递归函数,但正如其作者指出的那样,它没有成功。但是stack samples递归没有问题。如果在递归函数调用期间获取堆栈样本,则该函数在堆栈中出现不止一次,可能多次。然而,函数或调用函数的任何代码行的包含时间成本仍然只是它在堆栈上的时间的一小部分。为了解这一点,假设以恒定频率采集样本,总共有 M 个样本,并且特定函数或代码行出现在其中的 F 部分。如果可以使该函数或代码行不花时间,例如通过删除它、围绕它进行分支或将其传递给无限快的处理器,那么它就不会被采样。然后它出现的 M*F 个样本将消失,将执行时间缩短 F 部分。

关于c - 使用 gprof 的奇怪分析输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21563303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com