哦,伙计,从哪里开始?
首先,我很惊讶这是新闻。其次,问题不在于分析器不好,而在于某些分析器是坏的。作者建立了一个,他们认为,这是好的,只是通过避免他们在他们评估的那些中发现的一些错误。错误很常见,因为有关性能分析的一些持续存在的神话。
但让我们保持积极的态度。如果想找到加速的机会,这真的非常简单:
采样应与程序状态不相关。
这意味着在一个真正随机的时间发生,无论程序是在I / O中(用户输入除外),还是在GC中,还是在紧凑的CPU环路中,或者其他什么。
采样应读取函数调用堆栈,
以便确定在采样时哪些语句处于“活动”状态。原因是每个调用站点(调用函数的点)的百分比成本等于它在堆栈上的时间分数。(注意:本文完全关注自拍时间,忽略了大型软件中可避免函数调用的巨大影响。事实上,原版背后的原因是为了帮助找到这些电话。gprof
报告应按行(而不是按功能)显示百分比。
如果识别出“hot”函数,人们仍然必须在其中寻找考虑时间的“hot”代码行。该信息在示例中!为什么要隐藏它?
一个几乎普遍的错误(纸张共享)是过于关注测量的准确性,而对位置的准确性不够关注。例如,下面是一个性能调优示例,其中识别并修复了一系列性能问题,从而导致复合加速 43 倍。在修复之前,必须准确了解每个问题的大小,而是要知道其位置。性能调优的一个现象是,通过减少时间来解决一个问题,会放大剩余问题的百分比,因此更容易找到它们。只要发现并修复了任何问题,就会朝着发现和解决所有问题的目标取得进展。按大小递减顺序修复它们不是必需的,但必须精确定位它们。
关于测量的统计准确性问题,如果调用点在堆栈上一定时间百分比F(如20%),并且取N(如100)随机时间样本,则显示调用点的样本数是二项式分布,均值= NF = 20,标准差 = sqrt(NF(1-F)) = sqrt(16) = 4。因此,显示它的样本百分比将为20%+/- 4%。那么这是准确的吗?不是真的,但问题已经发现了吗?正是。
事实上,问题越大,就百分比而言,找到它所需的样本就越少。例如,如果采集了 3 个样本,并且其中 2 个样本上显示一个呼叫点,则很可能非常昂贵。(具体来说,它遵循beta发行版。如果生成 4 个统一的 0,1 个随机数并对其进行排序,则第 3 个随机数的分布就是该呼叫点的成本分布。它的平均值为(2 + 1)/(3 + 2) = 0.6,因此,给定这些样本,这是预期的节省。插入:你得到的加速因子由另一个发行版BetaPrime控制,其平均值为4。因此,如果您取3个样本,在其中2个样本上看到一个问题,并消除该问题,平均而言,这将使程序速度提高四倍。
现在是时候让我们程序员在分析这个主题上把蜘蛛网从我们的脑海中吹走了。
免责声明 - 该论文未能引用我的文章:Dunlavey,“使用从调用堆栈采样派生的指令级成本进行性能调优”,ACM SIGPLAN Notices 42,8(2007年8月),第4-8页。