9

我正在研究分析器之间的主要仪器和采样。我想出了以下信息:

  • 采样:停止程序的执行,取 PC 从而推断程序是
  • 检测:向程序添加一些开销代码,以便增加一些指针以了解程序

如果上述信息有误,请纠正我。

在此之后,我查看了执行时间,有人说检测比采样需要更多时间!它是否正确?

如果是,那是为什么?在采样中,您必须为进程之间的上下文切换付出代价,而在后者中,您在同一个程序中没有成本

我错过了什么吗?

干杯!=)

4

2 回答 2

9

采样分析器生成的中断通常会在总执行时间中增加微不足道的时间,除非您的采样间隔非常短(例如 < 1 ms)。

使用检测分析可能会产生很大的开销,例如在多次调用的小型叶函数上,因为与函数的执行时间相比,对检测库的调用可能很重要。

于 2011-01-12T16:36:51.960 回答
8

这取决于你想成为多么传统。

gprof做你提到的那些事情。以下是对此的一些评论。

有一种学派认为分析是关于测量的。测量什么?好吧,任何东西 - 只是测量。随之而来的想法是,您想要获得的是正在发生的事情的“大图”。这所学校主要着眼于试图找到“慢函数”,没有明确定义这甚至意味着什么,并告诉你去那里进行优化。

另一个学校说你真的在调试。您想精确定位某种类型的错误——那些不会使程序不正确的错误,而是它们花费的时间太长。这些都不是大事。它们是代码中非常精确的点,其中发生的事情花费了比必要更多的时间。具体多少并不重要。重要的是它的位置可以固定。从这个角度来看,分析开销是无关紧要的,测量的准确性也是如此。衡量的目的是查看节省了多少时间。

我认为,一个成功跨越两个阵营的分析器是Zoom,因为它在挂钟时间对调用堆栈进行采样,并在行/指令级别显示堆栈上的时间百分比。其他一些分析器也这样做,但大多数都没有。

I'm in the second school, and here's an example of what you can accomplish with it.

Here's a more brief discussion of the issues.

于 2011-01-12T20:53:33.737 回答