2016-10-25 74 views
0

我讀過的有關currentTimeMillis和nanoTime的一切似乎只關注精度。如果我只是以毫秒爲單位尋找經過時間,那麼我應該使用哪一個,如果我想獲得最佳性能?用Java測量流逝時間的最快方法

似乎像currentTimeMillis將是答案,因爲我不需要將ns的最終答案轉換爲ms,但是這是從我的應用程序的角度來看的,並且在引擎蓋下面發生的事情可能會使它成爲錯誤的選擇,這就是我問的原因。

+0

我個人只是用#currentTimeMillis,你很少會需要納秒的精度,以及上都可以發生的不準確之處是微不足道的,除非你是如此規模的工作已經(例如,如果你正在檢查10秒,3 -5毫秒的不準確性不會殺了你,即使不準確可能會少得多)。儘管iirC#currentTimeMillis比較可以爲負值,但是,除非您正在處理該比例(例如,以10毫秒爲間隔進行計時),否則不太可能。 – Rogue

+0

nanoTime與currentTimeMillis一樣準確(最差),如果不是更好的話 - 精確度的條款。至於哪個更快*你需要更清楚一點,以便我理解。 –

+0

NTP,用戶,閏秒和其他來源會在某些情況下直接更改'currentTimeMillis'的值,使您的測量完全錯誤。如果你能忍受這一點,那就去吧。否則,使用nanoTime,這是一個嚴格單調的計數器,以及爲什麼你應該使用nanoTime來處理任何嚴重的應用程序。 – zapl

回答

2

純Java中基本上只有兩種選擇;你已經將它們命名爲:

  • System.currentTimeMillis
  • System.nanoTime

兩種方法都JVM內部函數。
在Linux上,它們分別被編譯爲直接調用gettimeofdayclock_gettime
在Windows上 - 分別爲GetSystemTimeAsFileTimeQueryPerformanceCounter

這些方法的性能在很大程度上取決於平臺,CPU架構,操作系統版本,Java版本,併發線程數等。例如上在我的Windows筆記本電腦currentTimeMillis上需要7 ns,而nanoTime - 16 ns,而在多處理器Linux服務器上,這兩種方法大約需要40 ns。所以,這取決於。

我強烈建議閱讀阿列克謝Shipilёv的帖子Nanotrusting the nanotime覆蓋Java的時間測量的許多方面。

2

您不應該使用currentTimeMillis,始終使用nanoTime來測量已用時間。實際上使用currentTimeMillis可能會產生負面結果。這是因爲它使用系統時鐘,該系統時鐘被調整(有時會倒退)到您所在時區的時間。 nanoTime方法使用由JVM啓動的時鐘,該時鐘正好用於計時。

相關問題