逐行分析Java

逐行分析Java,java,profiling,Java,Profiling,我正在尝试分析我的代码以检测瓶颈。我搜索了一些档案,但我从来没有找到我要找的东西 我过去使用过很多python,有这样一个软件: 谁给予这种回报: 0 Line Hits Time Per Hit % Time Line Contents 11 @profile 12 def compute_p

我正在尝试分析我的代码以检测瓶颈。我搜索了一些档案,但我从来没有找到我要找的东西

我过去使用过很多python,有这样一个软件: 谁给予这种回报:

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:我已经知道你的工具包,jprofiler,visualwm,但我想在代码中加入一些东西。

我已经从事性能分析工作很长时间了,我很确定,你不会找到这样的工具。我认为,首先构建这样一个工具是不可行的

这其中涉及到很多不可估计的因素,例如,hotspot VM将在了解可能的执行路径或执行频率后对代码进行反编译和重新编译。因此,一行代码的执行时间可能会随着时间的推移而显著变化

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

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

我的建议是坚持使用您已经命名的默认分析器,直到您找到了您的悲伤的根源,然后切换到一些手动技术或使用重构提取包含热点的部分方法,以获得更清晰的理解,代码的哪一部分对不期望的行为负责


如果你想建立微观基准:干脆忘了它。微型基准测试几乎从不显示任何可靠或可转移的数据,即使您正确地获取了这些数据,而且可能性非常高,但您根本无法正确地获取这些数据。

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

为什么要在代码中使用它?收集分析信息通常会使应用程序的速度减慢很多,因此您通常希望按需运行它,这就是jprofiler等的工作方式。