2012-10-23 108 views
5

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

现在我想报告准确的性能分析数据。如果没有内联,我们会产生大量开销(函数基本上是一个单一的循环,但它经常被称为)。

我不知道是否有可能指示valgrind处理代码的特定部分,因为它本身是一个函数(如makros CALLGRIND_START_INSTRUMENTATION,CALLGRIND_STOP_INSTRUMENTATION),而不强制函数不内联。

回答

5
valgrind --tool=callgrind 

能够显示一个关于在CPU(和其他成本,如 缓存)是花很多细节。 kcachegrind(可视化工具)可以很容易地显示各种成本 (包括内联函数)。

尝试运行例如搭配:

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

注:看看指令级的成本,你必须使用kcachegrind

+0

的确很好。 kcachegrind是一个非常好的工具! – ypnos

-1

林不知道如果这是你想要什么,但我不确定这是不是:):
http://valgrind.org/docs/manual/cg-manual.html#cg-manual.overview

而且,由于一个指令缓存读取每执行指令 执行,你可以找到请输出每条 行执行多少条指令,这对传统分析很有用。

+0

是的,我读了线,但是我怎么也找不到做任何超出功能范围的粒度。 – ypnos

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; 
} 

应该这样做。