【问题标题】: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
        但根据您的情况,它们可能会或可能不会足够(请记住,它们在大多数情况下都可以,除非我们谈论的是关键问题)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-31
          • 2011-08-12
          • 1970-01-01
          • 2018-08-05
          相关资源
          最近更新 更多