我有一组应用程序,它们构成了工作流程的管道。在 ingress (一个Java应用程序)处触发了一个事件,并且发生了一些处理,并将流程转移到管道中的下一个应用程序。流程一直这样,直到最后一个应用程序-出口 (也是Java应用程序)。
我想计算从事件触发到出口应用程序中的最后一个任务所需的总时间。
到目前为止,我已经使用 System.currentTimeMillis()和 System.nanoTime()来记录事件触发的时间,然后再次记录时间最后一个出口应用程序完成其任务。然后,我将两者之间的差值用于衡量整个事件所花费的总时间。
现在,当我将得到的结果(如上所述的时间)与手动时钟时间验证进行比较时,我发现它几乎是非常准确的。但是,我不确定这是否是正确的方法,因为它们(入和出)是独立的过程。我看到,由于 currentTimeMillis 具有固定的引用,并且由于两个进程都在同一主机上以相同的系统时间运行,因此这不会成为问题。
但是我读到 nanoTime 是来自JVM的任意引用。如果是这样,两个运行独立的JVM实例的独立Java应用程序是否相同?在不同的进程中使用 nanoTime()进行计算的结果也给出了精确的时间间隔。
对于许多应用程序的单向管道,计算运行时间的最合适方法是什么?我采用的方法正确吗?
PS:自从我读到 nanoTime 更精确并且只想对其进行比较以来,我已经使用了上述两种API。
答案 0 :(得分:0)
您应该对正在做的事情感到满意,因为用于计时的硬件指令应该是一致的,而不管所运行的CPU是什么。由于Java需要与在2个潜在的不同CPU(如果应用程序本身是多线程)上调用nanoTime()并能够比较这些时间进行竞争,因此它应该已经确保它使用的是硬件范围的计时器,而不是线程或特定于CPU的计时器。 现在-如果您在不同的硬件系统上运行不同的Java进程,那将是另一回事...