一尘不染

有推荐的Java性能分析教程吗?

java

是否有推荐的Java应用程序性能分析教程?

我现在在分析时使用JProfilerEclipse

测试与性能工具平台(TPTP)。但是,尽管配备了出色的武器,但作为Java剖析新手还是新手,我仍然缺少指出瓶颈的一般理论和技能。


阅读 167

收藏
2020-09-09

共1个答案

一尘不染

概要分析是一门多学科的学科。

比较流行的一种是您要进行 测量
。也就是说,您尝试查看每个函数花费多长时间和/或被调用多少次。显然,如果一个函数花费很少的时间,那么加快它的收益将很小。但是,如果要花费很多时间,那么您就必须进行侦探工作,以找出该功能的哪个部分负责该时间。不要期望函数时间加起来就是总时间,因为函数彼此调用,而函数A可能要花费很多时间的原因是它调用函数B也要花费很多时间。

这种方法可能会发现很多问题,但这取决于您是一名优秀的侦探,并且能够清楚地思考各种时间,例如挂钟时间与CPU时间,自拍时间与包含时间。例如,一个应用程序看起来可能很慢,但是功能时间可能全部报告为接近零。这可能是由于程序受I
/ O约束。如果I / O是您所期望的,那可能很好,但是它可能正在执行一些您不知道的I / O,然后您就可以返回侦探工作了。

探查器的普遍期望是,如果您可以解决足够的问题以使速度提高10%或20%,那将是非常不错的,而且我从未听说过探查器被反复使用以实现更大的提速的故事。

另一种方法不是测量,而是 捕获
。它基于以下想法:在程序花费的时间(以挂钟为单位的时间)长于您想要的时间期间,您主要想知道它在做什么,而找出原因的一种方法是停止它并询问或拍摄其状态的快照,然后对其进行分析,以完全了解其正在执行的操作以及为什么在特定的时间点正在执行此操作。如果您多次执行此操作,并且看到它多次尝试执行某项操作,则可以对该活动进行有效地优化。所不同的是,您没有问
多少 ?你在问 什么为什么
这是另一个解释。
(请注意,获取此类快照的速度并不重要,因为您不是在询问时间,而是在询问程序在做什么以及为什么。)

就Java而言,这是一种技术含量低但高效的技术这样做的方法,或者您可以在Eclipse中使用“暂停”按钮。另一种方法是使用特定类型的探查器,该探查器在挂钟时间(例如,不希望对I
/
O视而不见的情况下,对CPU进行采样)对整个调用堆栈进行采样(例如,在等待用户输入时),并在代码行级别进行汇总,而不仅仅是功能级别,时间百分比,而不是绝对时间。为了获得时间百分比,对于任何示例中出现的每一行代码,它都应该告诉您包含该行的示例百分比,因为如果您可以使该行消失,则可以节省该百分比。(您应该忽略它试图告诉您的其他内容,例如调用图,递归和自拍时间。)满足此规范的探查器很少,但其中一个是RotateRight
/ Zoom。
,但是我不确定它是否可以与Java一起使用,并且可能还有其他功能。

在某些情况下,在实际速度较慢的情况下,可能难以获得堆栈样本。然后,由于您追求的是百分比,因此您可以对代码执行任何操作,从而更轻松地获取样本而无需更改百分比。一种方法是通过在其周围环绕一个临时循环(例如100次迭代)来
放大
代码。另一种方法是在调试器下设置数据更改断点。这将导致代码解释速度比正常情况下慢10-100倍。另一种方法是使用闹钟计时器在缓慢的时间内关闭,并使用它来获取样本。

使用捕获技术,如果您反复使用它来查找并执行多个优化,则可以期望达到接近最佳的性能。对于大型软件而言,瓶颈更多,这可能意味着很多因素。堆栈溢出的人报告的系数是7倍至60倍。

捕获技术在难以弄清线程为何在等待时(例如,在另一个处理器上等待事务完成时)的情况下遇到麻烦。(测量也有同样的问题。)在这种情况下,我使用费力的方法来合并带时间戳的日志。

2020-09-09