【问题标题】:Capturing the executing time between 2 statements Java?捕获两条语句Java之间的执行时间?
【发布时间】:2011-03-12 12:16:14
【问题描述】:

我想记录在 Java 类中从语句 A 到语句 B 的时间。在这些语句之间,有许多 Web 服务调用。我想知道java中是否有一些类似秒表的功能可以用来捕捉确切的时间?

卡迪

【问题讨论】:

  • 您需要比毫秒更精确的数据吗?如果没有, System.currentTimeMillis() 应该这样做 - 在开头调用它,在结尾调用它,然后减去。

标签: java time stopwatch


【解决方案1】:

这将为您提供两次 nanoTime() 调用之间的纳秒数。

long start = System.nanoTime();
// Java statements
long diff = System.nanoTime() - start;

对于更复杂的方法,有几个针对秒表类的重复问题:

【讨论】:

    【解决方案2】:

    System.currentTimeMillis 会以毫秒为单位,nanoTime 会以纳秒为单位。

    如果您尝试比较不同技术的性能,请注意 JVM 环境很复杂,因此只花一次时间是没有意义的。我总是写一个循环,在其中执行方法 1 几千次,然后执行 System.gc,然后执行方法 2 数千次,然后执行另一个 System.gc,然后循环返回并再次执行整个操作至少五次或六次。这有助于平均化垃圾收集、即时编译以及 JVM 中发生的其他神奇事情的时间。

    【讨论】:

      【解决方案3】:

      @Ben S 的回答很到位。

      但是,需要注意的是,在代码中插入时间测量语句的方法不能扩展:

      • 这会让你的代码看起来一团糟。
      • 它会使您的应用程序运行速度变慢。拨打System.nanoTime() 的电话不是免费的!
      • 它引入了错误的可能性。

      如果您的真正目标是尝试找出应用程序运行缓慢的原因,以便决定要优化什么,那么更好的解决方案是使用 Java 分析器。这样做的好处是您需要对源代码进行零更改。 (当然,剖析并没有给你在特定部分花费的确切时间。相反,它给你时间比例......这对于决定优化的地方要有用得多。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        • 2016-12-14
        • 2013-01-29
        相关资源
        最近更新 更多