[英]Wrong Time with System.currentTimeMillis () (Java)
我做了一個小程序來測試System.currentTimeMillis()。 我有一個奇怪的結果。 這是我的日志:
1 26-12-09 20:48:21 - [Log] lTime = 1261860501009
2 26-12-09 20:48:21 - [Log] lTime = 1261860501012
3 26-12-09 20:48:21 - [Log] lTime = 1261864899078
4 26-12-09 20:48:21 - [Log] lTime = 1261860501033
5 26-12-09 20:48:21 - [Log] lTime = 1261860501069
如您所見,第3行存在問題。時間磨損是錯誤的。 它應該在1261860501012和1261860501033之間。大約有73毫秒的誤差。
有人知道問題來自哪里?
非常感謝
bill0ute
編輯:操作系統:Debian 4.0,Java:6_17。
我的代碼:
while (true)
setLog (System.currentTimeMillis ());
編輯:程序在基於Linux的VPS上運行
System.currentTimeMillis()
依賴於系統時鍾。 看起來系統時鍾已被外部程序微調,對於可能是NTP的 Linux。
請注意,您不應使用System.currentTimeMillis()
來測量已用時間。 最好使用System.nanoTime()
但即使這樣也不能保證是單調的。
首先,你有一個小錯字,它是73毫秒,而不是秒(那將是令人不安的:-))。
為了達到這一點,您應該知道Java是一種非常高級的語言,只能訪問通過本機函數調用提供給您的系統函數。 這些調用是由您的虛擬機實現的,並且有很多(Sun,Open,Dalvik ..),所以不能給出一般建議,但返回時間currentTimeMillis取決於許多東西,如線程(在VM和本機線程中),板載計時器等的分辨率。我承認結果很奇怪,但除非你高度依賴於他們的正確順序,否則我不會打擾而只是生活在異常中十分之一秒的范圍。
如果您需要更具體的建議,請粘貼一些源代碼!
編輯:
在看過您的源代碼之后,我非常確定您的Log函數使用某種優先級處理或線程,這會導致錯誤的結果。 只是嘗試分配有問題的方法的返回值,並將該變量傳遞給您的日志:
long foo = System.currentTimeMillis();
setLog(foo);
我們曾經看過類似的東西,在Ubuntu上運行AMD64x2芯片。 如果你還有芯片,我會開始尋找。
有問題的方法取決於系統時鍾,系統時鍾可能有問題。 有關通過ntpd(8)守護程序保持系統時鍾准確的問題的討論,請參見http://support.ntp.org/bin/view/Support/KnownOsIssues 。
我還建議http://www.vmware.com/pdf/vmware_timekeeping.pdf討論VMWare中系統時鍾的准確性。 它對系統時鍾的討論也很普遍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.