最近Windows上的时钟精度似乎有所改变。我记得自Windows 7以来很准确(1毫秒分辨率),现在时间会以15至16毫秒的步长跳动。我因一些(尽管写得不好)单元测试失败而注意到了这一点(测试检查写记录和读记录之间的某些时间间隔)。
这影响以下实现:
- System.currentTimeMillis() - LocalTime.now() - LocalDateTime.now() - ZonedDateTime.now()
我知道要使用System.nanoTime()差值来测量经过的时间,但我仍然想知道是否错过了将时钟分辨率改回15-16毫秒的更改。
环境:
- Windows 10版本1709 - JRE/JDK 1.8.0_171-b11(64位)
是否有人也注意到了这一点?这种分辨率更改的原因是什么?
编辑: 检查此行为的测试代码(请参见输出:时间更改和更改之前的样本数)
这影响以下实现:
- System.currentTimeMillis() - LocalTime.now() - LocalDateTime.now() - ZonedDateTime.now()
我知道要使用System.nanoTime()差值来测量经过的时间,但我仍然想知道是否错过了将时钟分辨率改回15-16毫秒的更改。
环境:
- Windows 10版本1709 - JRE/JDK 1.8.0_171-b11(64位)
是否有人也注意到了这一点?这种分辨率更改的原因是什么?
编辑: 检查此行为的测试代码(请参见输出:时间更改和更改之前的样本数)
@Test
public void testCurrentTimeMillis() {
test(() -> System.currentTimeMillis());
}
@Test
public void testNanoTime() {
test(() -> System.nanoTime());
}
@Test
public void testLocalTime() {
test(() -> LocalTime.now());
}
@Test
public void testLocalDateTime() {
test(() -> LocalDateTime.now());
}
@Test
public void testZonedDateTime() {
test(() -> ZonedDateTime.now());
}
private <T> void test(Supplier<T> timeSupplier) {
int samples = 20;
String lastTimeString = null;
int count = 0;
while (samples > 0) {
count++;
String timeString = timeSupplier.get().toString();
if (!timeString.equals(lastTimeString)) {
System.out.println(timeString + " (" + count + ")");
lastTimeString = timeString;
count = 0;
samples--;
}
}
}