2013-02-24 30 views
0

在多線程代碼System.nanoTime()產生很小的不準確性,每當線程被重新安排? 如果是的話,這個錯誤會累積,這在單線程代碼中也是如此嗎?在多線程代碼System.nanoTime()產生很小的不準確性

例如,當線程開始執行在開始使用System.nanoTime()剛剛從線程塊中退出它使用相同的System.nanoTime()

+1

請注意,大多數計算機只有軟時間,因爲任何硬件TrueTime解決方案都很昂貴。根據硬件,操作系統和編程語言的不同,軟件時間的準確性可能高達1ms。請參閱此文檔:http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#nanoTime()它表示它的行爲不保證 – 2013-02-24 09:24:01

+0

檢查TrueTime的東西: http://www.symmetricom.com/ – 2013-02-24 09:25:52

+0

你如何衡量這種不準確?你有測試嗎? – 2013-02-24 19:16:14

回答

1

你是什麼意思記錄時間之前得到它的時候再由「小錯誤」?儘管System.nanoTime()爲您提供了納秒級的分辨率,但它不能保證它所測量的經過時間的準確性。據我所知,調用System.nanoTime()不會中斷線程調度;方法調用和執行的成本很低,但就是這樣。 (當然,如果你做了足夠的這些調用,那麼執行大量的這些調用將累積相當多的CPU時間。)

+0

對於每個System.nanoTime(),500ns或1500ns是不小的代價,我沒有做這些測試我自己,但你可以在這裏找到它,我只是想知道[鏈接](http://stackoverflow.com/questions/ 2476203/java-system-nanotime-is-really-slow-is-it-the-it-possible-implement -per-high-performance) – waheebyaqub 2013-02-24 09:57:31

+0

@waheebyaqub - 如果1500 ns是測量時間的重要部分,那麼測量的準確性可能是更大的誤差來源。此外,系統負載的變化,垃圾收集器的偶爾暫停以及執行環境的其他變化會引入比1500ns更多的變化。就像您的鏈接中最新推出的答案指出的那樣,正確處理嚴格循環的方法是統計抽樣。它平均出大量的錯誤,並減少儀器本身在結果中的影響。 – 2013-02-24 17:06:22