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 表达式作为参数的函数定义为内联函数 | 内联函数本质 - 宏替换 )

C++ 为啥要引入内联函数、、

内联函数和宏

内联函数分析