Callgrind 内联函数
Posted
技术标签:
【中文标题】Callgrind 内联函数【英文标题】:Callgrind inlined functions 【发布时间】:2012-10-23 12:20:34 【问题描述】:我正在分析我的代码,我已经找到了其中最昂贵的部分。然而,它发生在一个内联函数中。为了衡量影响,我强制该函数不被内联。
现在我想报告准确的分析数据。如果没有内联,我们的开销会很大(该函数基本上是一个循环,但它被非常非常频繁地调用)。
我想知道是否可以指示 valgrind 将代码的特定部分视为其本身的函数(如 makros CALLGRIND_START_INSTRUMENTATION、CALLGRIND_STOP_INSTRUMENTATION)而不强制函数不被内联。
【问题讨论】:
【参考方案1】:valgrind --tool=callgrind
能够显示很多关于 cpu 位置的详细信息(以及其他成本,例如 作为缓存)被使用。 kcachegrind(可视化工具)可以轻松显示各种成本 (包括内联函数)。
尝试运行,例如与:
valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes
注意:要查看指令级别的成本,您必须使用 kcachegrind
【讨论】:
【参考方案2】:也许您可以在调用函数之前和函数开头调用 CALLGRIND_TOGGLE_COLLECT 宏,同样适用于函数退出和函数调用之后。 例如
int main()
CALLGRIND_TOGGLE_COLLECT;
myFunction();
CALLGRIND_TOGGLE_COLLECT;
__attribute__((noinline))
void myFunction()
CALLGRIND_TOGGLE_COLLECT;
//Do stuff
CALLGRIND_TOGGLE_COLLECT;
应该做的伎俩。
【讨论】:
【参考方案3】:我不确定这是否是你想要的,但我不确定不是:) :http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview
此外,由于每条指令执行一次指令缓存读取 执行,您可以找出每个执行了多少条指令 行,这对于传统的分析很有用。
【讨论】:
是的,我读了那行,但是我找不到超出函数范围粒度的方法。以上是关于Callgrind 内联函数的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin函数 ⑦ ( 内联函数 | Lambda 表达式弊端 | “ 内联 “ 机制避免内存开销 - 将使用 Lambda 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )