在 Java 中实现精确的时间测量

2022-09-03 01:08:45

Java 提供了两种获取当前时间的方法:和 。第一个以纳秒为单位给出结果,但实际精度比这差得多(许多微秒)。System.nanoTime()System.currentTimeMillis()

JVM 是否已经为每台特定机器提供了最佳价值?否则,是否有一些Java库可以提供更精细的测量,可能是通过绑定到特定的系统?


答案 1

获得超精确的时间测量的问题在于,一些处理器不能/不提供如此微小的增量。

据我所知,这是您能找到的最好的测量方法。System.currentTimeMillis()System.nanoTime()

请注意,两者都返回一个值。long


答案 2

这在Java中测量时间到纳秒级有点毫无意义;偶尔的GC命中将很容易消除这可能给出的任何准确性。无论如何,文档指出,虽然它提供了纳秒级的精度,但它与纳秒级的精度不是一回事。有些操作系统在任何情况下都不会报告纳秒(这就是为什么在访问它们时你会发现答案量化为1000;这不是运气,而是限制)。

不仅如此,根据操作系统实际实现该功能的方式,您可能会发现无论如何都会通过量化结果(例如,答案总是以64或128结尾,而不是中间值)。

同样值得注意的是,该方法的目的是找到某些(附近)开始时间和现在之间的两个时差;如果你在一个长时间运行的应用程序开始时使用System.nanoTime(),然后在很长一段时间后使用System.nanoTime(),它可能已经偏离了很远的实时。因此,您应该只在小于1s的时间段内真正使用它;如果您需要比这更长的运行时间,毫秒应该足够了。(如果不是,那就编造最后几个数字;你可能会给客户留下深刻的印象,结果也会同样有效。


推荐