Java:如何查看代码的哪些部分运行得最多? (分析)

时间:2020-03-06 14:20:03  来源:igfitidea点击:

我正在用Java编写一个简单的跳棋游戏。当我将鼠标悬停在板上时,我的处理器将加速至50%(内核为100%)。

我想找出这期间我的代码的哪一部分(假设是我的错)正在执行。

我已经尝试过调试,但是逐步调试在这种情况下不能很好地工作。

有什么工具可以告诉我问题出在哪里吗?我当前正在使用Eclipse。

解决方案

这称为"分析"。IDE可能附带一个:请参阅Java中的Open Source Profilers。

分析?我不知道我们使用的是什么IDE,但是Eclipse有一个不错的专家,并且在java-source上还有一些开源分析器的列表。

1)这是你的错:)

2)如果我们使用的是eclipse或者netbeans,请尝试使用分析功能-它应该很快告诉我们代码在哪里花费了很多时间。

3)失败了,在我们认为内部循环是的地方添加控制台输出-我们应该能够快速找到它。

是的,有这样的工具:我们必须分析代码。我们可以在Eclipse中尝试TPTP,也可以尝试JProfiler。这样我们就可以查看被调用的内容以及调用的频率。

使用探查器。有许多。这是一个列表:http://java-source.net/open-source/profilers。
例如,我们可以使用Java编码探查器JIP。

使用探查器(例如yourkit)

或者对一些常见组件使用JUnit测试用例和代码覆盖工具。如果有调用其他组件的组件,我们将很快看到它们被执行了很多次。

我在JUnit测试用例中使用了Clover,但是对于开源,我听说EMMA相当不错。

简而言之,探查器将告诉我们程序的哪个部分被调用多少次。

我没有对程序进行太多的分析,因此我没有太多的经验,但是在测试时我一直在使用NetBeans IDE分析器。 (我通常也使用Eclipse。我还将研究Eclipse中的概要分析功能。)

NetBeans探查器将告诉我们哪个线程执行了多长时间,哪些方法被调用了多长时间,并且将提供条形图以显示每个方法花费了多少时间。这应该给我们一个提示,指出哪种方法导致了问题。如果我们感到好奇,可以看看NetBeans IDE提供的Java分析器。

概要分析是一种通常用于测量程序的哪些部分占用大量执行时间的技术,而该技术又可以用于评估执行优化是否对提高程序性能有利。

祝你好运!

这是一个典型的"高CPU"问题。

有两种高CPU问题

a)线程在哪里使用一个内核的100%CPU(这是情况)

b)当我们执行某些操作时,CPU使用率"异常高"。在这种情况下,CPU可能不是100%,但是会异常高。通常,当我们在代码中进行CPU密集型操作(例如XML解析,序列化反序列化等)时,就会发生这种情况。

情况(a)易于分析。当我们遇到30%的时间间隔内100%CPU 5-6线程转储时。查找处于活动状态(处于"可运行"状态)并且在同一方法内的线程(可以通过监视线程堆栈来推断出该线程)。我们很可能会看到"忙碌等待"(请参见下面的代码作为示例)

while(true){
  if(status) break;
  // Thread.sleep(60000); // such a statement would have avoided busy wait
}

情况(b)也可以使用等间隔的线程转储进行分析。如果幸运的话,我们将能够找到问题代码;如果我们不能使用线程转储来识别问题代码,则可以找到问题代码。我们需要求助于探查器。以我的经验,YourKit分析器非常好。

我总是先尝试使用线程转储。探查器只会是最后的选择。在80%的情况下,我们将能够使用线程转储进行识别。

三叶草会给一个很好的报告,显示每个行和分支的命中数。例如,此行执行了7次。

可以使用Eclipse,Maven,Ant和IDEA的插件。它是免费的开放源代码,或者我们可以获得30天的评估许可证。

如果我们使用的是Sun Java 6,则bin目录中的JVisualVM随附了最新的JDK版本。这是一个功能强大的监视和性能分析工具,使用它几乎不需要花费任何精力,甚至不需要使用特殊参数启动程序即可。JVisualVM仅列出所有当前正在运行的Java进程,然后选择要使用的Java进程。

该工具将告诉我们哪些方法正在使用所有处理器时间。

那里有许多更强大的工具,但是首先要有一个免费的游戏。然后,当我们了解可用的其他功能时,就会对它们如何有所了解。

在单线程代码中,我发现添加了一些如下语句:
System.out.println(" A:" + System.currentTimeMillis());
与使用事件探查器一样简单且有效。我们可以很快缩小导致问题的代码部分。