【问题标题】:Measure Java Program Performance衡量 Java 程序性能
【发布时间】:2012-03-03 21:48:08
【问题描述】:
我有一个旧应用程序,一个 JAR 文件,它经过了一些增强。基本上代码的某些部分必须随着修改一些逻辑而被修改。
比较旧版和新版,新版比旧版慢约 2 倍。
我正在尝试缩小导致速度变慢的原因,但我发现自己使用 System.println 和 System.currentTimeMillis() 来测量某些 for 循环的时间。这真的变得非常乏味。
是否有 Java 性能工具可以帮助我弄清楚为什么 NEW JAR 比旧 JAR 慢 2 倍?
提前致谢。
【问题讨论】:
标签:
java
profiling
performance-testing
【解决方案1】:
JProfiler 具有比较 CPU 快照的能力。记录新旧JAR文件的执行情况并保存快照(如果JVM最后退出,配置“JVM退出”触发器保存快照)。
然后用“Session->Compare Snapshots in New Window”打开快照比较窗口,添加两个快照。热点比较看起来像这样(在这种情况下设置了视图过滤器):
它会立即显示哪些方法会导致执行时间增加。
另一种分析执行时间差异的方法是调用树比较,如下所示:
免责声明:我公司开发 JProfiler。
【解决方案2】:
您应该使用分析器。这将向您显示哪些方法花费的时间最多(以及调用它们的方法),而无需您猜测要测量哪些方法。
Java 带有一个名为 hprof 的内置分析器,但另请参阅:
【解决方案3】:
根据进程运行的时间长短,我会考虑 Visual VM 1.3.3。如果你下载了所有的插件,你将能够看到堆、线程、对象等。这应该会有所帮助,而且不会花一分钱。
我相信它假定了 Oracle/Sun JVM。
【解决方案4】:
像YourKit 这样的分析器工具或像Hyperic's Sigar 这样可靠地测量性能的工具是您案例的理想选择。看看这些工具。
前者会发现代码中的瓶颈和/或内存泄漏(不是全部),而后者是一个 API,您可以可靠地测量性能,因为 Oracle 的 JVM 和 OpenJDK 无法可靠/一致/准确地获得性能指标(例如 CPU 挂钟时间或应用程序花费的 CPU 时间、内存使用情况、应用程序线程等)。
默认情况下,Java 为这些东西提供了包。
例如:
java.lang.management.ManagementFactory
java.lang.management.ThreadMXBean
但根据您的情况,它们可能会或可能不会足够(请记住,它们在大多数情况下都可以,除非我们谈论的是关键问题)。