繁体   English   中英

如果探查器不是答案,我们还有其他选择吗?

[英]If profiler is not the answer, what other choices do we have?

在观看Joshua Bloch的演出“表现焦虑”后,我阅读了他在“评估Java Pro fi lers的准确性”演讲中提出的论文。 引用结论:

我们的结果是令人不安的,因为它们表明在我们的七个基准测试和两个生产JVM中大多数普遍存在的错误 - 并且显着 - 所有四个最先进的专业人员都会产生不正确的专业知识。 不正确的配置文件很容易导致性能分析师花时间优化对性能影响最小的冷​​方法。 我们表明,不使用屈服点进行采样的概念验证问题不会遇到上述问题

论文的结论是我们无法真正相信剖析器的结果。 但是,使用分析器的替代方法是什么。 我们应该回去,只是用我们的感觉做优化吗?

更新 :讨论中似乎遗漏的一点是观察者效应 我们能否构建一个真正“ 观察者效应 ”的探测器 - 免费?

哦,伙计,从哪里开始?

首先,我很惊讶这是新闻。 其次,问题不在于剖析器是坏的,而是有些剖析器是坏的。 他们认为,通过避免他们在评估的错误中发现的一些错误,他们认为这是好的。 错误是常见的,因为关于性能分析的一些持续的神话

但我们要积极。 如果想找到加速的机会,那真的很简单:

  • 抽样应该与计划的状态不相关
    这意味着无论程序是在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页。

如果我正确阅读, 本文仅讨论基于样本的分析 许多分析器也进行基于仪器的分析。 它慢得多,还有一些其他问题,但它不应该受到纸张谈论的偏见的影响。

论文的结论是我们无法真正相信剖析器的结果。 但是,使用分析器的替代方法是什么。

不是。论文的结论是当前的剖析器测量方法存在特定的缺陷。 他们提出修复方案。 这篇论文是最近的。 我希望剖析器最终能够实现这个修复。 在那之前,即使是有缺陷的分析器仍然比“感觉”好得多。

除非您正在构建需要每个CPU周期的前沿应用程序,否则我发现分析器是查找代码中10%最慢部分的好方法。 作为开发人员,我认为在几乎所有情况下都应该是你真正关心的。

我有http://www.dynatrace.com/en/的经验,我可以告诉你它很擅长找到低悬的水果。

Profilers就像任何其他工具一样,他们有他们的怪癖,但我会相信他们可以在任何一天找到你的应用程序中的热点来查看。

如果您不信任分析器,那么您可以通过使用面向方面的编程进入偏执模式,绕过应用程序中的每个方法,然后使用记录器记录每个方法调用。

您的应用程序确实会变慢,但至少您将精确计算每个方法被调用的次数。 如果您还想查看每个方法执行的时间,请环绕每个方法perf4j

将所有这些统计信息转储到文本文件后,使用一些工具提取所有必要信息,然后将其可视化。 我想这会让你很好地了解你的应用程序在某些地方的速度有多慢。

实际上,您最好在数据库级别进行性能分析。 大多数企业数据库都能够在一段时间内显示最常见的查询。 开始处理这些查询,直到顶部查询达到300毫秒或更短,您将取得很大进展。 Profilers对于显示堆的行为和识别被阻塞的线程非常有用,但我个人从未对开发团队在识别热方法或大型对象方面有太多牵引力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM