为何Instant.now()在Unix机器上的精度远高于Windows机器?
为何Instant.now()在Unix机器上的精度远高于Windows机器?
嘿,我之前特意做了个小测试,想搞明白不同系统上Instant.now()的精度差异到底咋回事,先给你看看我写的超简单测试代码——就是死循环打印当前的Instant时间:
public class Test { private static final Logger logger = LogManager.getLogger(Test.class.getName()); public static void main(String... args) { while (true) { logger.info(Instant.now()); } } }
当我在一台跑Windows 11的Intel Core i9笔记本上跑这个代码时,结果很明显:大部分日志行打印的时间戳完全一模一样,要隔好一会儿才会跳一次。
这背后其实是系统底层时钟API的差异在搞鬼:
- 咱们常用的Unix/Linux类系统,默认用的都是高精度的时钟源,比如
CLOCK_MONOTONIC_RAW或者CLOCK_REALTIME,这些时钟源的更新频率能到纳秒级。Java的Instant.now()在Unix平台上会直接调用这些高精度接口,所以你能拿到非常细粒度的时间,看起来精度就高很多。 - 而Windows这边呢,传统的系统时钟滴答间隔大概是10-15毫秒,早期的系统时间API(比如
GetSystemTimeAsFileTime)就受这个限制。虽然现在Windows也有了像QueryPerformanceCounter这样的高精度接口,但Java的Instant.now()在Windows平台上默认还是调用旧的系统时钟接口,所以你才会看到大量重复的时间戳,感觉精度特别低。
备注:内容来源于stack exchange,提问作者mchen
相关产品推荐
相关产品推荐

