分析特定函数 C++

Posted

技术标签:

【中文标题】分析特定函数 C++【英文标题】:Profiling specific functions C++ 【发布时间】:2012-08-24 06:14:34 【问题描述】:

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

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

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

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

有更简单的方法吗?

如果你有其他更干净的方法,请告诉我

【问题讨论】:

通过使用英特尔 VTune 放大器 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我会看看telemetry。它主要针对想要比较每帧数据的游戏开发者,但它似乎非常符合您的要求。

【讨论】:

【参考方案3】:

你想要这4个函数的self-time,所以你可以专门优化它们。

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

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

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

Here is some discussion of the issues and a constructive recommendation.

【讨论】:

以上是关于分析特定函数 C++的主要内容,如果未能解决你的问题,请参考以下文章

将成员函数集调用为特定变体的正确 C++ 变体语法是啥?

在 C++ 中,如何在不使用 if 语句的情况下选择运行特定的成员函数?

为啥 Visual C++ 不会在特定函数中遇到断点或单步执行?

我们如何为 C++ 无序集定制我们自己的哈希函数以获得特定的顺序?

如何从 C++ 中的 getline 函数中提取特定的子字符串?

按名称或签名计算函数调用。 GCC、C++