2012-03-03 78 views
2

我有一个旧的应用程序,一个JAR文件,经过一些增强。基本上,代码的某些部分必须随着修改某些逻辑而被修改。测量Java程序性能

比较OLD版本和NEW版本,NEW版本比旧版本慢大约2倍。

我想缩小什么导致减速,但我发现自己用System.currentTimeMillis()使用System.println测量某些for-loops的时间。这真的变得非常单调乏味。

是否有一个Java性能工具,可以帮助我弄清新JAR为何比旧版本慢大约2倍?

在此先感谢。

+0

参见http://stackoverflow.com/questions/410437/is-stopwatch-benchmarking-acceptable和http://stackoverflow.com/questions/447739/java-performance-testing,可能几个人... – DNA 2012-03-03 21:52:57

回答

0

根据过程的运行时间,我会考虑Visual VM 1.3.3。如果你下载所有的插件,你将能够看到堆,线程,对象等,这应该有所帮助,而且不会花费一分钱。

我相信它假定Oracle/Sun JVM。

0

一个Profiler工具像YourKit或可以像Hyperic's Sigar一样可靠地测量性能为你的情况提供一个好的选择。看看这些工具。
由于Oracle的JVM & OpenJDK无法可靠/始终如一地获取性能指标,因此前者会发现代码和/或内存泄漏(不是全部)的瓶颈,而后者是可以可靠地测量性能的API。准确地(如CPU挂钟时间或从应用程序花费的CPU时间,内存使用情况,应用程序线程等)。

默认情况下,Java为这些东西提供了软件包。

例如:
java.lang.management.ManagementFactory
java.lang.management.ThreadMXBean
但根据您的情况下,他们可能会或可能是不够的(记住,他们是在大多数情况下,除非确定我们所谈论的事情的关键)。

2

JProfiler有能力比较CPU快照。记录旧JAR文件和新JAR文件的执行情况并保存快照(如果JVM在最后退出,则配置保存快照的“JVM退出”触发器)。

然后使用“在新窗口中的会话 - >比较快照”打开快照比较窗口并添加两个快照。一个热点比较看起来像这样(视图设置过滤器在这种情况下):

enter image description here

它会立即显示出哪些方法负责执行时间的增加。

来分析执行时间的差异的另一种方法是调用树比较,这将是这样的:

enter image description here

免责声明:我公司开发的JProfiler。