簡體   English   中英

System.nanoTime / System.currentTimeMillis = 107(應該為1e6嗎?)

[英]System.nanoTime / System.currentTimeMillis = 107 (should this be 1e6 ?)

根據java.lang.System API

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

Ideone演示

因此,非常接近1e6。

請注意, 可能不是這樣,因為由於時鍾偏斜的校正, System.currentTimeMillis()不能順利進行。 但是,這些應該很少出現,因此在大多數情況下,運行此代碼時,您會看到大約1e6。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM