nan*_*nda 39 java performance profiler
在观看Joshua Bloch的演出"表现焦虑"后,我阅读了他在"评估Java Pro fi lers的准确性"演讲中提出的论文.引用结论:
我们的结果是令人不安的,因为它们表明在我们的七个基准测试和两个生产JVM中大多数普遍存在的错误 - 并且显着 - 所有四个最先进的专业人员都会产生不正确的专业知识.不正确的配置文件很容易导致性能分析师花时间优化对性能影响最小的冷方法.我们表明,不使用屈服点进行采样的概念验证问题不会遇到上述问题
论文的结论是我们无法真正相信剖析器的结果.但是,使用分析器的替代方法是什么.我们应该回去,只是用我们的感觉做优化吗?
更新:讨论中似乎遗漏的一点是观察者效应.我们能否建立一个真正" 观察者效应 " 的探测器- 免费?
Mik*_*vey 42
哦,伙计,从哪里开始?
首先,我很惊讶这是新闻.其次,问题不在于剖析器是坏的,而是有些剖析器是坏的.他们认为,通过避免他们在评估的错误中发现的一些错误,他们认为这是好的.错误是常见的,因为关于性能分析的一些持续的神话.
但我们要积极.如果想找到加速的机会,那真的很简单:
抽样应该与计划的状态不相关.
这意味着无论程序是在I/O中(用户输入除外),还是在GC中,或在紧凑的CPU循环中,或者其他任何时候,都会发生真正的随机时间.
采样应该读取函数调用堆栈,
以便确定样本时哪些语句是"活动的".原因是每个调用站点(调用函数的点)的百分比成本等于它在堆栈上的时间部分.(注意:本文完全关注自己的时间,忽略了大型软件中可避免函数调用的巨大影响.事实上,原文背后的原因gprof是帮助找到那些调用.)
报告应逐行显示(而不是按功能).
如果识别出"热"功能,则仍然需要在其内部寻找占用时间的"热"代码行.那些信息在样本中!为何隐藏它?
一个几乎普遍存在的错误(论文共享)是过多地关注测量的准确性,而不是关注位置的准确性.例如,下面是性能调整的一个示例, 其中识别并修复了一系列性能问题,导致复合加速43次.在修复每个问题之前,确切地知道每个问题的大小并不是必需的,而是知道它的位置.性能调整的现象是通过减少时间来解决一个问题,放大剩余问题的百分比,因此更容易找到.只要任何找到并解决了问题,朝着找到并解决所有问题的目标迈进了一步.按尺寸递减顺序修复它们并不是必需的,但必须确定它们.
关于统计测量精度的问题,如果呼叫点在堆栈上的某个百分比的时间F(如20%)和N(如100)随机时间样本,则显示呼叫的样本数量point是二项分布,均值= NF = 20,标准差= sqrt(NF(1-F))= sqrt(16)= 4.因此,显示它的样本百分比将为20%+/ - 4% .这是准确的吗?不是真的,但是发现了问题?正是.
实际上,问题越大,就百分比而言,定位它所需的样本越少.例如,如果采集3个样本,并且其中2个出现呼叫点,则很可能成本非常高.(具体来说,它遵循β分布.如果你生成4个统一的0,1个随机数,并对它们进行排序,那么第3个分布就是该呼叫点的成本分布.它的意思是(2 + 1)/( 3 + 2)= 0.6,这是预期的节省,给定这些样本.)INSERTED:你获得的加速因子由另一个分布BetaPrime控制,其平均值为4.所以如果你采取3个样本,请参阅其中2个问题,并消除了这个问题,平均而言,你会使程序加快四倍.
现在是时候我们的程序员在描绘主题上吹掉了我们头脑中的蜘蛛网.
免责声明 - 该论文未能引用我的文章:Dunlavey,"从调用堆栈采样得到的指令级成本的性能调优",ACM SIGPLAN Notices 42,8(2007年8月),第4-8页.
如果我正确阅读,本文仅讨论基于样本的分析.许多分析器也进行基于仪器的分析.它慢得多,还有一些其他问题,但它不应该受到纸张谈论的偏见的影响.
论文的结论是我们无法真正相信剖析器的结果.但是,使用分析器的替代方法是什么.
不是.论文的结论是当前的剖析器测量方法存在特定的缺陷.他们提出修复方案.这篇论文是最近的.我希望剖析器最终能够实现这个修复.在那之前,即使是有缺陷的分析器仍然比"感觉"好得多.
| 归档时间: |
|
| 查看次数: |
4867 次 |
| 最近记录: |