我有一个旧的应用程序,一个JAR文件,经过一些增强。基本上,代码的某些部分必须随着修改某些逻辑而被修改。测量Java程序性能
比较OLD版本和NEW版本,NEW版本比旧版本慢大约2倍。
我想缩小什么导致减速,但我发现自己用System.currentTimeMillis()使用System.println测量某些for-loops的时间。这真的变得非常单调乏味。
是否有一个Java性能工具,可以帮助我弄清新JAR为何比旧版本慢大约2倍?
在此先感谢。
我有一个旧的应用程序,一个JAR文件,经过一些增强。基本上,代码的某些部分必须随着修改某些逻辑而被修改。测量Java程序性能
比较OLD版本和NEW版本,NEW版本比旧版本慢大约2倍。
我想缩小什么导致减速,但我发现自己用System.currentTimeMillis()使用System.println测量某些for-loops的时间。这真的变得非常单调乏味。
是否有一个Java性能工具,可以帮助我弄清新JAR为何比旧版本慢大约2倍?
在此先感谢。
根据过程的运行时间,我会考虑Visual VM 1.3.3。如果你下载所有的插件,你将能够看到堆,线程,对象等,这应该有所帮助,而且不会花费一分钱。
我相信它假定Oracle/Sun JVM。
你应该使用一个分析器。这将告诉你哪些方法花费的时间最多(以及调用它们的是什么),而不必猜测要测量哪些方法。
的Java带有一个内置分析器称为hprof,还能看到:
一个Profiler工具像YourKit或可以像Hyperic's Sigar一样可靠地测量性能为你的情况提供一个好的选择。看看这些工具。
由于Oracle的JVM & OpenJDK无法可靠/始终如一地获取性能指标,因此前者会发现代码和/或内存泄漏(不是全部)的瓶颈,而后者是可以可靠地测量性能的API。准确地(如CPU挂钟时间或从应用程序花费的CPU时间,内存使用情况,应用程序线程等)。
默认情况下,Java为这些东西提供了软件包。
例如:
java.lang.management.ManagementFactory
java.lang.management.ThreadMXBean
但根据您的情况下,他们可能会或可能是不够的(记住,他们是在大多数情况下,除非确定我们所谈论的事情的关键)。
JProfiler有能力比较CPU快照。记录旧JAR文件和新JAR文件的执行情况并保存快照(如果JVM在最后退出,则配置保存快照的“JVM退出”触发器)。
然后使用“在新窗口中的会话 - >比较快照”打开快照比较窗口并添加两个快照。一个热点比较看起来像这样(视图设置过滤器在这种情况下):
它会立即显示出哪些方法负责执行时间的增加。
来分析执行时间的差异的另一种方法是调用树比较,这将是这样的:
免责声明:我公司开发的JProfiler。
参见http://stackoverflow.com/questions/410437/is-stopwatch-benchmarking-acceptable和http://stackoverflow.com/questions/447739/java-performance-testing,可能几个人... – DNA 2012-03-03 21:52:57