【问题标题】:Measuring execution time across a pipeline of multiple Java applications跨多个 Java 应用程序的管道测量执行时间
【发布时间】:2018-07-24 03:30:22
【问题描述】:

我有一组构成工作流管道的应用程序。在入口 (Java 应用程序) 处触发一个事件,并进行一些处理并将流转移到管道中的下一个应用程序。流程像这样继续下去,直到最后的最后一个应用程序 - egress (也是一个 Java 应用程序)

我想计算从事件触发器到 egress 应用程序中的最后一个任务所用的总时间。

到目前为止,我已经使用 System.currentTimeMillis()System.nanoTime() 来记录触发事件的时间,然后再次记录时间最后一个 egress 应用程序完成其任务。然后我用这两者之间的差异来衡量整个事件所花费的总时间。

现在,当我将得到的结果 (对于如上所述测量的时间) 与手动时钟时间验证进行比较时,我发现它几乎非常准确。但是,我不太确定这是否是正确的方法,因为它们(入口和出口)是独立的进程。我看到,由于 currentTimeMillis 具有固定的引用,并且由于两个进程在同一主机上以相同的系统时间运行,因此这不会成为问题。

但我读到 nanoTime 是来自 JVM 的任意引用。如果是这样,运行不同 JVM 实例的两个独立 Java 应用程序是否会相同?为什么跨不同进程使用 nanoTime() 的计算也给出了精确的时间间隔。

除了为许多应用程序的这种单向管道计算运行时间最合适的方法是什么?我采取的方法是否正确?

PS:我已经使用了上述两个 API,因为我读到 nanoTime 更精确,只想比较它们。

【问题讨论】:

    标签: java performance runtime timing


    【解决方案1】:

    你应该对你正在做的事情没问题,因为用于获取时间的硬件指令应该是一致的,无论你运行的 CPU 是什么。由于 Java 需要应对在 2 个可能不同的 CPU 上调用 nanoTime()(如果应用程序本身是多线程的)并且能够比较这些时间,因此它应该已经确保它正在使用硬件范围的计时器而不是线程或特定于 CPU 的计时器。 现在 - 如果你在不同的硬件系统上运行不同的 java 进程,那将是另一回事......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多