按活动类型分析程序

时间:2011-02-08 19:53:13

标签: c++ c profiling

典型分析器的输出是代码中的函数列表,按程序运行时每个函数所用的时间量排序。

这非常好,但有时候我对大部分时间的节目感兴趣,而不是大多数情况下EIP的地方感兴趣。

我的假设分析器的示例输出是:

Waiting for file IO - 19% of execution time.
Waiting for network -  4% of execution time
Cache misses        - 70% of execution time.
Actual computation  -  7% of execution time.

有这样的探查器吗?是否有可能从“标准”分析器中获得这样的输出?

我正在使用Linux,但我很高兴听到其他系统的任何解决方案。

2 个答案:

答案 0 :(得分:1)

这只是Solaris,但dtrace可以监控几乎所有类型的I / O,开/关CPU,特定功能的时间,睡眠时间等。我不确定它是否可以确定缓存未命中,假设你表示CPU缓存 - 我不确定CPU是否提供该信息。

答案 1 :(得分:1)

请查看at thisthis

考虑任何线程。在任何时刻,它都在做某事,并且它是出于某种原因这样做,而缓慢可以被定义为由于不良原因而花费的时间 - 它不需要花费那么多时间。

在某个时间点拍摄线程的快照。也许它在缓存未命中,在指令中,在语句中,在函数中,从另一个函数中的调用指令调用,从另一个函数调用,依此类推,直到call _main。这些步骤中的每一步都有一个原因,即对代码的检查会显示出来。

  1. 如果这些步骤中的任何一个步骤不是一个很好的理由而且可以避免,那么这个时刻就不需要花费。
  2. 当时磁盘可能会进入某个扇区,因此可以启动某些数据流,因此可以填充缓冲区,因此可以在函数中满足读取语句,并从该函数调用该函数在另一个函数中调用站点,从另一个函数调用该站点,依此类推,直至call _main,或者任何恰好是该主题的顶部。

    1. 重复上一点1.
    2. 因此,找到瓶颈的方法是找出代码花费时间的原因,而找到它的最佳方法是拍摄其状态的快照。 EIP或该州的任何其他小部分都不会这样做,因为它不会告诉你为什么

      很少有人能够“得到它”。那些做的是挂钟时间堆栈采样器,它按代码行(而不是函数)报告活动时间的百分比(不是时间量,特别是不是“self”或“exclusive” “时间。”其中一个是Zoom,还有其他人。

      看看EIP挂断的地方就像试着用一只秒针告诉时钟。测量功能就像试图在时钟上分辨一些缺少的数字。仅在CPU时间期间进行性能分析,而不是在阻塞时间期间进行性能分析,就像试图在时钟上告诉时间长时间随机停止运行。关注测量精度就像试图将午餐时间计时到第二个。

      这不是一个神秘的主题。