System.nanoTime()、System.currentTimeMillis()的區(qū)別

1、public static long nanoTime()
官方解釋:
以納秒為單位返回正在運行的Java虛擬機的高分辨率時間源的當前值。
該方法只能用于測量經(jīng)過時間,與系統(tǒng)或掛鐘時間的任何其他概念無關(guān)。 返回的值表示納秒,因為一些固定但任意的起始時間(可能在將來,所以值可能是負數(shù))。 在Java虛擬機的實例中,該方法的所有調(diào)用都使用相同的來源; 其他虛擬機實例可能會使用不同的來源。
該方法提供納秒精度,但不一定是納秒分辨率(即,值的變化頻率) - 除了分辨率至少與currentTimeMillis()的分辨率不同之外,不作任何保證 。
跨越大約292年(2 63納秒)的連續(xù)呼叫的差異將無法正確計算由于數(shù)字溢出所造成的時間。
僅當在Java虛擬機的同一實例中獲得的兩個此類值之間的差異被計算時,此方法返回的值才會變得有意義。
例如,測量代碼執(zhí)行多長時間:
long startTime = System.nanoTime(); // ... the code being measured ... long estimatedTime = System.nanoTime() - startTime;
一個應(yīng)該使用t1 - t0 < 0 ,而不是t1 < t0 ,因為數(shù)值溢出的可能性。
比較兩個nanoTime值
long t0 = System.nanoTime(); ... long t1 = System.nanoTime();
結(jié)果
運行Java虛擬機的高分辨率時間源的當前值,以納秒為單位
從以下版本開始:
1.5

分析解釋:
這玩意是個單調(diào)鐘,它保證了同一個JVM實例上先后調(diào)用兩次這個函數(shù),得到的值絕對不會倒退,如果你系統(tǒng)時間被調(diào)回去了它本身也不會減少,可以被用來測量兩次操作的耗時等。
它的絕對值是沒什么意義的,不同操作系統(tǒng)的不同JDK版本實現(xiàn)不一樣,JVM源碼也提到了。

2、public static long currentTimeMillis()
官方解釋:
返回當前時間(以毫秒為單位)。 請注意,雖然返回值的時間單位為毫秒,但該值的粒度取決于底層操作系統(tǒng),并且可能較大。 例如,許多操作系統(tǒng)以幾十毫秒為單位測量時間。
有關(guān)“計算機時間”和協(xié)調(diào)世界時間(UTC)之間可能出現(xiàn)的輕微差異的討論,請參閱類別Date的說明。
結(jié)果
在1970年1月1日UTC之間的當前時間和午夜之間的差異,以毫秒為單位。

分析解釋:
與它相對的是“墻上時鐘”,在Java的實現(xiàn)就是System.currentTimeMillis(),它返回當前系統(tǒng)時間的毫秒數(shù)時間戳,但是假如操作系統(tǒng)的時間被回撥了(例如和時間服務(wù)器同步),返回值會減少,在一些場景(例如分布式數(shù)據(jù)庫判斷誰先提交)下是災(zāi)難性的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容