我正在分析我的代码,我已经找到了其中最昂贵的部分。然而,它发生在一个内联函数中。为了衡量影响,我强制该函数不被内联。
现在我想报告准确的分析数据。如果没有内联,我们会有很大的开销(该函数基本上是一个循环,但它被非常非常频繁地调用)。
我想知道是否可以指示 valgrind 将代码的特定部分视为一个函数本身(如 makros CALLGRIND_START_INSTRUMENTATION、CALLGRIND_STOP_INSTRUMENTATION)而不强制函数不被内联。
valgrind --tool=callgrind
能够显示有关 cpu(以及其他成本,例如缓存)花费位置的大量详细信息。kcachegrind(可视化工具)可以轻松显示各种成本(包括内联函数)。
尝试运行例如:
valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes
注意:要查看指令级别的成本,您必须使用 kcachegrind
也许您可以在调用函数之前和函数开始时调用 CALLGRIND_TOGGLE_COLLECT 宏,同样适用于函数退出和函数调用之后。例如
int main()
{
CALLGRIND_TOGGLE_COLLECT;
myFunction();
CALLGRIND_TOGGLE_COLLECT;
}
__attribute__((noinline))
void myFunction()
{
CALLGRIND_TOGGLE_COLLECT;
//Do stuff
CALLGRIND_TOGGLE_COLLECT;
}
应该做的伎俩。
我不确定这是否是你想要的,但我不确定它不是:):http:
//valgrind.org/docs/manual/cg-manual.html#cg-manual.overview
此外,由于每执行一条指令都会执行一次指令缓存读取,因此您可以了解每行执行了多少条指令,这对于传统的分析很有用。