逐行分析Java代码性能

5
我想要对我的代码进行性能分析以便找出瓶颈。我搜索了一些性能分析工具,但都未能找到符合要求的软件。
过去我经常使用Python,其中有这样一个软件:line_profiler,可以提供以下类型的结果:
0         Line     Hits  Time  Per Hit   % Time  Line Contents

11                                           @profile
12                                           def compute_prior(folder):
13                                               """
14                                               Given a folder, we compute the prior of neg and pos
15                                               folder = "./movie-reviews-en/train/"
16                                               """
17                                               # we compute the number of positive reviews
18         3         1719    573.0     52.9      number_positive = len([f for f in listdir(folder + "pos/")])
19                                               # then the negative
20         3         1512    504.0     46.6      number_negative = len([f for f in listdir(folder + "neg/")])
21                                               # we add it and we have the total
22         3            6      2.0      0.2      total = number_positive + number_negative
23                                               # we devide to have the probabilites
24         3            6      2.0      0.2      number_positive /= total
25         3            1      0.3      0.0      number_negative /= total
26                                               # we return this three numbers
27         3            3      1.0      0.1      return [number_positive, number_negative, total]

Java世界中是否有类似的东西?

感谢您的回复。

附言:我已经知道yourkit、jprofiler、visualwm,但我想要代码内部的东西。


你为什么想让它在代码内部?一般收集分析信息会使应用程序变慢,因此通常需要按需求运行,这就是jprofiler等工具的工作方式。 - Thomas
2个回答

6

我一直从事性能分析工作,很确定这样的工具是不存在的。首先,我认为构建这样的工具并不可行。

这其中有很多不确定性因素,例如,热点虚拟机将根据学习到的可能执行路径或执行频率对代码进行反编译和重新编译。因此,一行代码的执行时间随时间的变化可能会显著变化。

另外,您的监视解决方案将减慢应用程序的运行速度,并且更糟的是:它会改变您的代码的相对执行时间。这基本上意味着您可能会在没有监视的情况下发现热点。

您可以自己构建这样的工具,即通过System.nanoTime()来测量执行时间,但您肯定会发现这不是一条明智之路。

我的建议是,在确定问题来源之前,坚持使用您已经命名的默认分析器,然后切换到某些手动技术或使用重构来提取包含热点的方法的部分,以更清楚地了解哪个代码部分负责不良行为。

如果您想构建微基准测试,请忘记它。即使您正确进行了微基准测试,它们几乎永远不会显示任何可靠或可转移的数据,而且您无法正确进行微基准测试的可能性非常高。


0
你可能会发现VTune Amplifier非常有用,它是一个支持Java代码分析的分析器。你可以看到Java代码中的热点和性能指标分布在你的Java源文件中。真正有价值的是,VTune Amplifier可以显示纯Java代码和Java/C++混合模式代码的准确堆栈信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接