3

我研究过gprof。但不太明白如何实现以下目标:

我写了一个聚类程序。在每次迭代中,重复调用 4 个函数。大约有 100000 次迭代需要完成。我想知道每个函数花费了多少时间。
这些函数可能会调用其他子函数,并且可能涉及哈希图、地图等数据结构。但我不关心这些子函数。我只想知道所有这些父函数在所有迭代中花费了多少总时间。这将帮助我更好地优化我的程序。

gprof 的问题在于,它会分析每个函数。因此,甚至 stl 数据结构的功能也被考虑在内。

目前我正在使用clock_gettime。对于每个函数,我输出每次迭代所花费的时间。然后我操作这个输出文件。为此,我必须输入大量分析代码。分析代码使我的代码看起来非常复杂,我想避免它。这在行业中是如何做到的?

有没有更简单的方法来做到这一点?

如果您有其他更清洁的方法,请告诉我

4

3 回答 3

4

如果我理解正确,您感兴趣的是在您感兴趣的四个目标函数上花费了多少时间,而不是这些函数调用的任何子函数。

此信息在 gprof 的“flat”配置文件中的“self seconds”下提供。或者,如果您正在查看调用图,则此时间位于“自我”列中。

于 2012-08-24T07:50:49.947 回答
1

我会看看遥测。它主要针对想要比较每帧数据的游戏开发人员,但它似乎非常适合您的要求。

于 2012-08-24T07:45:13.660 回答
1

您想要这 4 个功能的自时间,因此您可以专门优化它们。

gprof将向您显示,占总时间的百分比。假设它是 10%。如果是这样,即使您能够将其优化到 0%,您也会获得 100/90 = 1.11 的加速因子,或 11% 的加速比。如果花了 100 秒,那太慢了,那么 90 秒也太慢了。

但是,这些函数所花费的包容性(自身加被调用者)时间可能要大得多,即 80% 来选择一个数字。如果是这样,您可以通过减少对这些被调用者的调用来进一步优化它。或者,您可能会发现被调用者花费了很大一部分做您严格不需要做的事情,例如为了一般性而测试他们的论点,在这种情况下,您可以用临时例程替换它们。

事实上,严格来说,没有自我时间这样的东西。即使是找到程序计数器的最简单指令实际上也是对微码子程序的调用。

以下是对这些问题的一些讨论和建设性建议。

于 2012-08-24T11:42:52.900 回答