Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java System.nanoTime/System.currentTimeMillis=107(这应该是1e6吗?)_Java_Scala - Fatal编程技术网

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

Java System.nanoTime/System.currentTimeMillis=107(这应该是1e6吗?),java,scala,Java,Scala,据 currentTimeMillis()以毫秒为单位返回当前时间 nanoTime()返回正在运行的Java虚拟机的当前值 机器的高分辨率时间源,以纳秒为单位 严格来说,纳秒是1e-9,毫秒是1e-3。因此,以纳秒为单位的持续时间必须是以毫秒为单位的相同持续时间的1e6的倍数。实际情况并非如此,原因是什么 scala> System.nanoTime / System.currentTimeMillis res0: Long = 107 System.nanoTime()具有任意起点;

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

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

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

scala> System.nanoTime / System.currentTimeMillis
res0: Long = 107
System.nanoTime()
具有任意起点;这不是unix时代

返回的值表示自某个固定但任意的起始时间起的纳秒数

所以你实际计算的是:

(unknownOffset + offsetFromEpochInNanos) / offsetFromEpochInMillis
这几乎肯定不是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);
输出(运行5次):

所以,非常接近1e6


请注意,可能不是这样,因为
System.currentTimeMillis()
由于时钟偏移的校正而无法顺利进行。但是,这些应该是不经常出现的,所以在运行此代码的大多数时候,您将看到大约1e6。

阅读javadocs中的内容,您将在nanotime下看到:此方法只能用于测量经过的时间,与任何其他系统或挂钟时间概念无关。非常感谢您非常清晰的解释和演示。哎哟,我的作品中的反对票太多了。真遗憾,看起来每个人都知道nanoTime vs currentTimeMillis在Java中的业务。
1000058.3725
1000045.4705
999549.1579210395
1000046.101
1000038.1045