一尘不染

System.nanoTime / System.currentTimeMillis = 107(应该为1e6吗?)

java

根据java.lang.System
API

currentTimeMillis()返回当前时间(以毫秒为单位)

nanoTime()返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。

严格来说,纳秒为1e-9,毫秒为1e-3。因此,以纳秒为单位的持续时间必须是以毫秒为单位的相同持续时间的1e6的倍数。实际上不是这种情况,这是什么原因?

scala> System.nanoTime / System.currentTimeMillis
res0: Long = 107

阅读 186

收藏
2020-12-03

共1个答案

一尘不染

System.nanoTime()有一个任意的起点;这不是unix时代。从Javadoc

自某个固定但任意的原始时间以来,返回的值表示纳秒

因此,您实际计算的是:

(unknownOffset + offsetFromEpochInNanos) / offsetFromEpochInMillis

除非unknownOffset碰巧为零,否则几乎肯定不会是1e6 。

如果您可以通过减去两次来消除未知偏移的影响,则可以看到该比率约为1e6:

long nanoStart = System.nanoTime();
long milliStart = System.currentTimeMillis();

Thread.sleep(2000);

long nanoEnd = System.nanoTime();
long milliEnd = System.currentTimeMillis();;

long nanoDelta = nanoEnd - nanoStart;
long milliDelta = milliEnd - milliStart;

System.out.println((double) nanoDelta / milliDelta);

输出(运行5次):

1000058.3725
1000045.4705
999549.1579210395
1000046.101
1000038.1045

Ideone demo

因此,非常接近1e6。

请注意, 可能 不是这样,因为System.currentTimeMillis()由于时钟偏斜的校正而无法顺利进行。但是,这些应该很少出现,因此在
大多数情况下, 运行此代码时,您会看到大约1e6。

2020-12-03