当前位置: 首页 > 面试题库 >

Java如果没有分析器,那么我们还有其他选择吗?

蒲坚
2023-03-14
问题内容

看完Joshua Bloch的演讲“ Performance Anxiety”后,我阅读了他在演讲“ Evaluation of Java Profillers的准确性”中建议的论文。引用结论:

我们的结果令人不安,因为它们表明配置文件不正确是普遍存在的-在我们的七个基准测试中的大多数以及两个生产JVM中(而且很重要),所有四个最新的配置文件都产生不正确的配置文件。不正确的配置文件很容易导致性能分析人员花时间html" target="_blank">优化对方法的影响最小的冷​​方法。我们表明,不使用屈服点进行采样的概念证明配置文件不会遇到上述问题

本文的结论是,我们不能真正相信分析器的结果。但是,使用分析器的替代方法是什么。我们应该回过头去只是用自己的感觉进行优化吗?


问题答案:

首先,我很惊讶这是新闻。其次,问题不在于探查器是坏的,而是某些探查器是坏的。作者认为,这只是通过避免在评估的错误中发现的一些错误,才建立了一个不错的错误。由于存在一些有关性能分析的长期存在的误解,因此经常会犯错误。

但是,让我们保持乐观。如果想找到加速的机会,那真的很简单:

采样应与程序状态无关。
这意味着在真正随机的时间发生,而不管程序是在I / O中(用户输入除外),GC中还是在紧密的CPU循环中,等等。

采样应读取函数调用堆栈,
以便确定采样时哪些语句是“活动的”。原因是每个调用站点(调用函数的点)的成本百分比等于其在堆栈上的时间的一部分。(注意:本文完全涉及自时,忽略了大型软件中可避免的函数调用的巨大影响。实际上,其背后的原因gprof是为了帮助找到这些调用。)

报告应按行显示百分比(而不按功能显示)。
如果识别出“热”功能,则仍然需要在其中寻找占时间的“热”代码行。这些信息在样本中!为什么隐藏它?

一个几乎普遍的错误(论文共有)是过多地关注测量精度,而不是位置精度。例如,这是一个性能调整的示例, 其中发现并解决了一系列性能问题,从而使复合速度提高了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个采样,请参见其中两个问题,并消除该问题,平均而言,您可使程序运行速度提高四倍。

现在是时候让我们的程序员在剖析主题上把蜘蛛网从头脑中吹灭了。

免责声明-该论文未能引用我的文章:Dunlavey,“从调用堆栈采样中得出的指令级成本进行性能调优”,ACM SIGPLAN Notices 42,8(2007年8月),第4-8页。



 类似资料:
  • 我正在使用Java Mission Control分析一个Java应用程序,它在飞行记录的主页上说:“尽管CPU负载很高,但该记录包含的分析样本很少。因此,分析数据可能不相关。” 它似乎在说真话。我要求它每10毫秒采样3分钟,应该是18000个样本,但我只看到996个样本。

  • Mybatis 和 Hibernate 各有各的优点吧,感觉用久了有点腻了。 查了一下,还有一种基于 JOOQ 的查询,像写 C# 的 LINQ 一样用 Java 来写 SQL,站内有一个介绍看了感觉还行 https://segmentfault.com/a/1190000045244062 所以 JOOQ、Hibernate、Mybatis Java 应该就是这三种 Dao Layer 的框架了

  • 问题内容: 到目前为止,我一直没有通过网络进行搜索,该语句始终具有if和else条件,例如。我想知道三元语句是否可以不使用。假设我有以下代码,如果不为空,我想关闭 (我正在使用Java编程语言。) 问题答案: 不,你不能那样做。 而是尝试以下方法:

  • 我让用户在一个< code>int[]中输入5个int的列表。然后,我用一个简单的< code>for语句遍历int[]中的这些int。我声明了一个名为“evens”的< code>int变量如果int[]中的数字at ,< code > evens ; 现在我有了 语句: 问题是,无论偶数的值是多少,都会调用它。它可以是5或3,但仍会被调用。我最近一直在使用C#,但这是简单的Java。 整机代码

  • 问题内容: 我正在使用Selenium2 / WebDriver来测试我的Web应用程序。所有测试都是用Java编写并与Maven一起运行。 在使用webdriver打开页面时,我想捕获页面发出的所有请求(图像,js和CSS文件等)。我使用此数据主要有两个原因 检查通话中的404(和其他错误) 检查分析代码是否有效(检查是否发送了正确的请求) 根据项目,我将Firebug与Netexport或Br

  • 我在文本字段中使用flex来显示我的值/范围。对于IOS,我使用属性adjustsFontSizeToFit和文本的minimumFontScale属性来实现理想的字体大小和缩放。我希望为Android启用相同的缩放。有人使用Android的任何技巧吗?