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

Pol*_*ase -3 java scala

根据java.lang.System API

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

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

严格来说,纳秒是1e-9,毫秒是1e-3.因此,以纳秒为单位的持续时间必须是相同持续时间的1e6的倍数(以毫秒为单位).实际情况并非如此,原因是什么?

scala> System.nanoTime / System.currentTimeMillis
res0: Long = 107
Run Code Online (Sandbox Code Playgroud)

And*_*ner 8

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

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

所以你实际计算的是:

(unknownOffset + offsetFromEpochInNanos) / offsetFromEpochInMillis
Run Code Online (Sandbox Code Playgroud)

几乎肯定不会是1e6,除非unknownOffset碰巧是零.

如果您可以通过减去两次来消除未知偏移的影响,您可以看到该比率大约为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);
Run Code Online (Sandbox Code Playgroud)

输出(运行5次):

1000058.3725
1000045.4705
999549.1579210395
1000046.101
1000038.1045
Run Code Online (Sandbox Code Playgroud)

Ideone demo

所以,非常接近1e6.

请注意,它可能不是这个,因为System.currentTimeMillis()由于时钟偏差的校正而不能顺利进行.但是,这些应该是不常见的,因此大多数情况下,当您运行此代码时,您将大致看到1e6.