在 Java 中实现精确的时间测量
2022-09-03 01:08:45
Java 提供了两种获取当前时间的方法:和 。第一个以纳秒为单位给出结果,但实际精度比这差得多(许多微秒)。System.nanoTime()
System.currentTimeMillis()
JVM 是否已经为每台特定机器提供了最佳价值?否则,是否有一些Java库可以提供更精细的测量,可能是通过绑定到特定的系统?
Java 提供了两种获取当前时间的方法:和 。第一个以纳秒为单位给出结果,但实际精度比这差得多(许多微秒)。System.nanoTime()
System.currentTimeMillis()
JVM 是否已经为每台特定机器提供了最佳价值?否则,是否有一些Java库可以提供更精细的测量,可能是通过绑定到特定的系统?
获得超精确的时间测量的问题在于,一些处理器不能/不提供如此微小的增量。
据我所知,这是您能找到的最好的测量方法。System.currentTimeMillis()
System.nanoTime()
请注意,两者都返回一个值。long
这在Java中测量时间到纳秒级有点毫无意义;偶尔的GC命中将很容易消除这可能给出的任何准确性。无论如何,文档指出,虽然它提供了纳秒级的精度,但它与纳秒级的精度不是一回事。有些操作系统在任何情况下都不会报告纳秒(这就是为什么在访问它们时你会发现答案量化为1000;这不是运气,而是限制)。
不仅如此,根据操作系统实际实现该功能的方式,您可能会发现无论如何都会通过量化结果(例如,答案总是以64或128结尾,而不是中间值)。
同样值得注意的是,该方法的目的是找到某些(附近)开始时间和现在之间的两个时差;如果你在一个长时间运行的应用程序开始时使用System.nanoTime(),然后在很长一段时间后使用System.nanoTime(),它可能已经偏离了很远的实时。因此,您应该只在小于1s的时间段内真正使用它;如果您需要比这更长的运行时间,毫秒应该足够了。(如果不是,那就编造最后几个数字;你可能会给客户留下深刻的印象,结果也会同样有效。