衡量Java程序性能

时间:2012-03-03 21:48:09

标签: java profiling performance-testing

我有一个旧的应用程序,一个JAR文件,经历了一些增强。基本上,代码的某些部分必须进行修改,同时修改一些逻辑。

将旧版本与旧版本进行比较,新版本比旧版本慢约2倍。

我正在尝试缩小导致速度减慢的原因,但我发现自己使用System.println和System.currentTimeMillis()来测量某些for循环的时间。这真的变得非常繁琐。

是否有一个Java性能工具可以帮助我弄清楚为什么新JAR比旧JAR慢2倍?

提前致谢。

4 个答案:

答案 0 :(得分:2)

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

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

enter image description here

它会立即显示哪些方法导致执行时间增加。

分析执行时间差异的另一种方法是调用树比较,如下所示:

enter image description here

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

答案 1 :(得分:1)

您应该使用分析器。这将显示哪些方法花费的时间最多(以及调用它们的方式),而无需猜测要测量哪些方法。

Java附带一个名为hprof的内置探查器,但另见:

答案 2 :(得分:0)

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

我认为它采用了Oracle / Sun JVM。

答案 3 :(得分:0)

YourKit这样的分析器工具或像Hyperic's Sigar一样可靠地衡量性能的工具对您的案例是一个很好的假设。看看那些工具。
前者会发现代码中存在瓶颈和/或内存泄漏(并非所有内容泄漏),而后者是一种API,您可以可靠地测量性能,因为Oracle的JVM& OpenJDK无法可靠/一致/准确地获取性能指标(例如CPU挂钟时间或从应用程序,内存使用,应用程序线程等中花费的CPU时间)。

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

例如:
java.lang.management.ManagementFactory
java.lang.management.ThreadMXBean
 但根据你的情况,他们可能会或可能不充分(请记住,除非我们谈论的是关键的事情,否则他们在大多数情况下都可以。)

相关问题