[英]System.nanoTime / System.currentTimeMillis = 107 (should this be 1e6 ?)
currentTimeMillis()返回當前時間(以毫秒為單位)
nanoTime()返回正在運行的Java虛擬機的高分辨率時間源的當前值,以納秒為單位。
嚴格來說,納秒為1e-9,毫秒為1e-3。 因此,以納秒為單位的持續時間必須是以毫秒為單位的相同持續時間的1e6的倍數。 實際上不是這種情況,原因是什么?
scala> System.nanoTime / System.currentTimeMillis
res0: Long = 107
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
因此,非常接近1e6。
請注意, 可能不是這樣,因為由於時鍾偏斜的校正, System.currentTimeMillis()
不能順利進行。 但是,這些應該很少出現,因此在大多數情況下,運行此代碼時,您會看到大約1e6。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.