- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在使用 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/
我有这种来自 Google map 自动完成的奇怪行为(或者我可能错过了某事)...想法?奇怪的: 您在输入中输入某物,例如“伦敦” 您按 [ENTER] 你按下 [CLEAR] 按钮 你点击进入'输
这段代码与《Learning Java》(Oracle Press Books)一书中的代码完全一样,但它不起作用。我不明白为什么它不起作用,它应该起作用。我用 OpenJDK 和 Sun JDK 7
示例 1 中究竟发生了什么?这是如何解析的? # doesnt split on , [String]::Join(",",("aaaaa,aaaaa,aaaaa,aaaaa,aaaaa,aa
我需要获得方程式系统的解决方案。为此,我使用函数sgesv_()。 一切都很好,它使我感到解决方案的正确结果。 但是我得到一个奇怪的警告。 警告:从不兼容的指针类型传递'sgesv_'的参数3 我正在
我目前在制作动画时遇到一个奇怪的问题: [UIView animateWithDuration:3 delay:0
alert('works'); $(window).load(function () { alert('does not work'); });
我的代码: public class MyTest { public class StringSorter implements Comparator { public
我正在学习 JavaScript。尝试理解代码, function foo (){ var a = b = {name: 'Hai'}; document.write(a.name +''
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这按预期工作: [dgorur@ted ~]$ env -i env [dgorur@ted ~]$ 这样做: [dgorur@ted ~]$ env -i which date which: no
struct BLA { int size_; int size()const{ return size_; } } int x; BLA b[ 2 ]; BLA * p = &b[
我有以下代码: #test img {vertical-align: middle;} div#test { border: 1px solid green; height: 150px; li
我想大多数使用过 C/C++ 的人都对预处理器的工作原理有一定的直觉(或多或少)。直到今天我也是这么认为的,但事实证明我的直觉是错误的。故事是这样的: 今天我尝试了一些东西,但我无法解释结果。首先考虑
我想为 TnSettings 做 mock,是的,如果通过以下方法编写代码,它就可以工作,问题是我们需要为每个案例编写 mock 代码,如果我们只 mock 一次然后执行多个案例,那么第二个将报告异常
我的项目中有以下两个结构 typedef volatile struct { unsigned char rx_buf[MAX_UART_BUF]; //Input buffer over U
Regex rx = new Regex(@"[+-]"); string[] substrings = rx.Split(expression); expression = "-9a3dcb
我的两个应用程序遇到了一个奇怪的问题。这是设置: 两个 tomcat/java 应用程序,在同一个网络中运行,连接到相同的 MS-SQL-Server。一个应用程序,恰好按顺序位于 DMZ 中可从互联
我目前正在与 Android Api Lvl 8 上的 OnLongClickListener 作斗争。 拿这段代码: this.webView.setOnLongClickListener(new
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
只是遇到了奇怪的事情。我有以下代码: -(void)ImageDownloadCompleat { [self performSelectorOnMainThread:@selector(up
我是一名优秀的程序员,十分优秀!