java小知識-納秒

京东云开发者發表於2024-11-26

作者:京東物流 崔鼕鼕

一、System.nanoTime()

java中,有這麼一個方法System.nanoTime() ,你用過嗎?

二、與System.currentTimeMillis()對比

System.currentTimeMillis()我們經常使用,可以參考對比一下

看方法意思,一個是納秒,一個是毫秒,二者有關係嗎?

先看看單位換算:一秒=1000毫秒 1毫秒=1000微秒 1微秒=1000納秒

那麼1毫秒=1000000納秒,二者是不是這樣的倍數關係?

帶著疑問,我們本地列印測試一下

System.out.println("毫秒="+System.currentTimeMillis());
System.out.println("納秒="+System.nanoTime());
輸出:
毫秒=1729763507201
納秒=257832682992

很顯然,不是 1:1000000的關係,具體是什麼呢?

三,方法解釋

看一下原始碼中的方法解釋

Returns the current value of the running Java Virtual Machine's high-resolution time source, in nanoseconds. This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.

大概意思,該方法返回正在執行的Java虛擬機器的高解析度時間源的當前值,單位為納秒。系統啟動時間到現在經歷的時間,與任何其他系統或掛鐘時間概念無關。

四,使用場景

如此精度的時間,使用場景有哪些呢

1) 效能分析:常用於效能分析和最佳化,System.nanoTime()可以測量程式碼段的執行時間,幫助開發人員找出效能瓶頸並進行最佳化。

比如:一個簡單的for迴圈,我們用System.nanoTime()計時,可以見更精細的耗時。

2) 計時器:在需要精確計時的場景下,如計算程式執行時間、延遲等,System.nanoTime()可以提供更精確的時間資訊,避免受系統時間調整的影響。

3) 併發控制:在多執行緒程式設計中,我們可能需要實現一些併發控制策略,如超時控制、任務排程等。可以用於獲取時間戳,幫助實現這些併發控制策略。

4) 隨機種子:Random類建構函式中使用System.nanoTime()作為種子值,提高隨機性。具體可以看一下Random類。

五,簡單總結

1)System.nanoTime()是高精度計數器,是相對時間。

2)jdk原始碼中很多地方使用了System.nanoTime(),我們可以學習參考。

3)小知識分享,不足之處歡迎大家指正,關於java裡的知識點也歡迎大家討論分享。

相關文章