我正在研究分析器之间的主要仪器和采样。我想出了以下信息:
- 采样:停止程序的执行,取 PC 从而推断程序是
- 检测:向程序添加一些开销代码,以便增加一些指针以了解程序
如果上述信息有误,请纠正我。
在此之后,我查看了执行时间,有人说检测比采样需要更多时间!它是否正确?
如果是,那是为什么?在采样中,您必须为进程之间的上下文切换付出代价,而在后者中,您在同一个程序中没有成本
我错过了什么吗?
干杯!=)
采样分析器生成的中断通常会在总执行时间中增加微不足道的时间,除非您的采样间隔非常短(例如 < 1 ms)。
使用检测分析可能会产生很大的开销,例如在多次调用的小型叶函数上,因为与函数的执行时间相比,对检测库的调用可能很重要。
这取决于你想成为多么传统。
gprof
做你提到的那些事情。以下是对此的一些评论。
有一种学派认为分析是关于测量的。测量什么?好吧,任何东西 - 只是测量。随之而来的想法是,您想要获得的是正在发生的事情的“大图”。这所学校主要着眼于试图找到“慢函数”,没有明确定义这甚至意味着什么,并告诉你去那里进行优化。
另一个学校说你真的在调试。您想精确定位某种类型的错误——那些不会使程序不正确的错误,而是它们花费的时间太长。这些都不是大事。它们是代码中非常精确的点,其中发生的事情花费了比必要更多的时间。具体多少并不重要。重要的是它的位置可以固定。从这个角度来看,分析开销是无关紧要的,测量的准确性也是如此。衡量的目的是查看节省了多少时间。
我认为,一个成功跨越两个阵营的分析器是Zoom,因为它在挂钟时间对调用堆栈进行采样,并在行/指令级别显示堆栈上的时间百分比。其他一些分析器也这样做,但大多数都没有。
I'm in the second school, and here's an example of what you can accomplish with it.