逐行分析Java

时间:2017-09-29 11:36:45

标签: java profiling

我试图分析我的代码来检测瓶颈。我搜索了一些探查器,但我找不到我想要的东西。

我过去使用了很多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世界中有类似的东西吗?

感谢您的回复。

p.s:我已经知道你的kit,jprofiler,visualwm了,但我想在代码中找到一些东西。

2 个答案:

答案 0 :(得分:2)

我一直在处理性能分析很长一段时间,我很确定,你找不到这样的工具。我不认为,首先建立这样一个工具是可行的。

这一点涉及很多不足之处,例如,热点-VM将在学习可能的执行路径或执行频率时​​解除代码并重新编译代码。因此,一行代码的执行时间可能会随着时间的推移而显着变化。

此外,您的监控解决方案会降低您的应用程序速度,更糟糕的是:它会更改代码的相对执行时间。这基本上意味着您可能会在没有监控的地方发现没有此类热点的地方发现热点。

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

我的建议是坚持你已经命名的默认探查器,直到你找到悲伤的来源然后切换到一些手动技术或使用重构来提取包含热点的方法的一部分以获得更清晰理解,代码的哪一部分是造成不良行为的原因。

如果您想构建微基准测试:简单地忘记它。微基准测试几乎从未显示任何可靠或可转移的数据,即使你做得对,机会非常高,你根本不能正确使用它们。

答案 1 :(得分:0)

您可能会发现有用的VTune Amplifier,它是支持Java code analysis的分析器。您将能够看到Java代码中的热点以及通过Java源文件分发的性能指标。真正有价值的是VTune Amplifier显示纯Java代码和Java / C ++混合模式代码的准确堆栈。