2012-01-22 48 views
6

我今天得到了一個有趣的「時間旅行」的問題,使用下面的代碼:時間的Java跟蹤:使用currentTimeMills()

for (int i = 0; i < 1; i++){ 
    long start = System.currentTimeMillis(); 
    // Some code here 
    System.out.print(i + "\t" + (System.currentTimeMillis() - start)); 
    start = System.currentTimeMillis(); 
    // Some code here 
    System.out.println("\t" + (System.currentTimeMillis() - start)); 
} 

而且我得到的結果

0 15 -606 

它似乎這是不可重複的。任何人都有在跑步期間內發生的事情的線索嗎?只是好奇...

新編輯:我用一個小測試來確認下面的答案。我運行程序並在運行期間更改系統時間,最後重複「時間行程」:

0 -3563323 163 

案例關閉。多謝你們!更多的話:currentTimeMillis()和nanoTime()都是基於系統定時器的,所以如果系統定時器更新(具體返回),它們將不是單調的。這種情況下最好使用一些基於互聯網的定時器。

+0

不確定'currentTimeMillis'是單調的。用System.nanoTime()'可能會有更好的結果,它專門用於測量間隔。 – Rom1

+0

@ asksw0rder:你可以再次運行相同的程序並更新第二個輸出是什麼? –

+0

@ asksw0rder變量i是什麼?它有什麼價值?在第一個輸出中獲得0是沒有意義的。 – sfrj

回答

11

System.currentTimeMillis()取決於系統時間。所以它可以被第三方系統修改。

對於測量時間是System.nanoTime()更好的選擇。

+0

+1提到更好的替代 – sfrj

+0

nanoTime()是對於這種情況也不好。最好使用基於互聯網的時間。 – asksw0rder

+0

我沒有說這是最好的選擇,只比'System.currentTimeMillis()'更好! ..在互聯網上測量納秒的技巧很棘手。 – Robin

0

我記得一些事情,比如對系統時間進行一次調整,與實際時間相匹配。並且由於currentTimeMillis依賴於可能發生的系統時鐘。你也是同步一個時間服務器,也可以。