1

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

4

3 回答 3

1

我至少可以谈论 Valgrind 和 gprof。

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

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

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

于 2012-08-14T12:48:04.473 回答
1

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

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

采样是一种不需要任何重新编译的方法,它只是以设定的间隔拍摄堆栈的快照。事实证明,这是一种发现瓶颈的有效方法。

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

于 2012-08-14T19:57:21.873 回答
0

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

除此之外,一些分析器通过在每个函数的开头和可能结尾处编译对记录保存例程的调用来工作。这些函数可以尝试记录函数使用的时间,以及调用它的一些记录。由于调用这些记录函数的开销,它的计时数字变得不准确。

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

其中隐含的是,时间的准确性对于定位“瓶颈”是必要的,据我所知,这从未被证明是正确的。我一直用来获得数量级加速的方法依赖于洞察程序在花费时间时所做的事情,而不是确切地花费了多少时间。如果您对统计原理感兴趣,可以查看此处

于 2012-08-14T13:54:28.937 回答