需要重新编译的分析器和不需要重新编译的分析器有什么区别?

时间:2012-08-14 05:45:52

标签: valgrind profiler gprof oprofile

使用需要重新编译源代码的分析器与调试选项(如gprof)和不需要重新编译的分析器(如Valgrind,OProfile,...)之间有什么区别?

3 个答案:

答案 0 :(得分:1)

我至少可以在Valgrind和gprof上发言。

使用这两者之间的主要区别基本上就是你已经说过的。对于gprof,您必须专门编译它以包含分析代码。然后运行可执行文件时,将执行分析代码(因为它已内置到程序中),然后创建一个gmon.out文件,然后由gprof处理该文件以显示程序的运行时统计信息。

Valgrind的不同之处在于您不需要以任何特殊方式编译程序(如果您希望输出有用,则添加调试符号除外)。 Valgrind将您的程序动态转换为在模拟CPU上运行的内部格式(尽管这是)。这意味着任何程序都可以通过Valgrind运行而无需特殊编译。

另一个重要区别是Valgrind可以报告比gprof更多的信息,但这与使用它没有特别的关联。

答案 1 :(得分:1)

我不熟悉命名的分析器,但有两种主要的分析方法:

Instrumentation ,此方法通常需要重新编译(并非总是如此,例如java和.Net应用程序可以动态检测)。使用此方法,可以准确地测量例程的调用频率,或某个循环所进行的迭代次数。

Sampeling 是一种不需要重新编译的方法,它只是以设置的间隔拍摄堆栈的快照。事实证明,这是找到瓶颈的有效方法。

有关这两种策略的更多信息here

答案 2 :(得分:0)

任何分析技术都需要符号表信息,因此必须在编译和链接中请求。

除此之外,一些分析器通过在每个函数的开头和可能结束时编译调用记录保存例程来工作。 这些函数可以尝试记录函数使用的时间,以及从中调用它的位置的一些记录。 调用这些记录功能的开销使其时序数据不准确。

其他分析器不需要这样做,而是依赖于调用堆栈的周期性样本。 这种分析器具有较低的开销。 由于其抽样的统计性质,其时间数据不准确。

隐含的是定时的准确性对于定位“瓶颈”是必要的,据我所知,这从未被证明是真实的。 获得数量级加速的method I've always used依赖于在花费时间的情况下洞察程序正在做什么,而不是精确花费多少时间。如果您对统计原理感兴趣,可以look here