6

我正在分析我的代码,我已经找到了其中最昂贵的部分。然而,它发生在一个内联函数中。为了衡量影响,我强制该函数不被内联。

现在我想报告准确的分析数据。如果没有内联,我们会有很大的开销(该函数基本上是一个循环,但它被非常非常频繁地调用)。

我想知道是否可以指示 valgrind 将代码的特定部分视为一个函数本身(如 makros CALLGRIND_START_INSTRUMENTATION、CALLGRIND_STOP_INSTRUMENTATION)而不强制函数不被内联。

4

3 回答 3

5
valgrind --tool=callgrind

能够显示有关 cpu(以及其他成本,例如缓存)花费位置的大量详细信息。kcachegrind(可视化工具)可以轻松显示各种成本(包括内联函数)。

尝试运行例如:

valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes 

注意:要查看指令级别的成本,您必须使用 kcachegrind

于 2012-12-04T19:58:17.737 回答
0

也许您可以在调用函数之前和函数开始时调用 CALLGRIND_TOGGLE_COLLECT 宏,同样适用于函数退出和函数调用之后。例如

int main()
{
    CALLGRIND_TOGGLE_COLLECT;
    myFunction();
    CALLGRIND_TOGGLE_COLLECT;
}

__attribute__((noinline))
void myFunction()
{
    CALLGRIND_TOGGLE_COLLECT;
    //Do stuff
    CALLGRIND_TOGGLE_COLLECT;
}

应该做的伎俩。

于 2012-12-04T14:06:21.083 回答
-1

我不确定这是否是你想要的,但我不确定它不是:):http:
//valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

此外,由于每执行一条指令都会执行一次指令缓存读取,因此您可以了解每行执行了多少条指令,这对于传统的分析很有用。

于 2012-10-23T13:26:53.383 回答