我的一個朋友向我展示了他所做的一些事情,並且我非常遺憾地解釋了這可能發生的情況:他使用System.nanotime來計時,並且每隔一秒給用戶一次更新以告知已經過了多少時間(Thread.sleep(1000)),並且它看起來是永遠的(等待10秒鐘需要大約3分鐘才能完成)。我們嘗試使用millitime來觀察已經過了多少時間:它每秒都會顯示已經經過了多少納米量級,而且我們看到,每秒鐘,納米級每秒鐘移動大約40-50毫秒。System.nanotime運行緩慢嗎?
我檢查了與System.nanotime和Java有關的錯誤,但它似乎是我能找到的唯一的東西,其中包括突然出現的節點greatly increasing and then stopping。我還瀏覽了this blog entry,這是基於我在另一個問題中讀到的內容,但沒有任何可能導致它的事情。
顯然這可以通過使用millitime來解決這種情況;這裏有很多解決方法,但是我很好奇的是,除了系統時鐘或者至少是CPU最精確的時鐘之外,還有其他問題(因爲這就是System.nanotime似乎使用的)這可能導致它像這樣一直運行緩慢?
long initialNano = System.nanoTime();
long initialMili = System.currentTimeMillis();
//Obviously the code isn't actually doing a while(true),
//but it illustrates the point
while(true) {
Thread.sleep(1000);
long currentNano = System.nanoTime();
long currentMili = System.currentTimeMillis();
double secondsNano = ((double) (currentNano - initialNano))/1000000000D;
double secondsMili = ((double) (currentMili - initialMili))/1000D;
System.out.println(secondsNano);
System.out.println(secondsMili);
}
secondsNano會沿着打印0.04線的東西,而secondsMili將打印的東西非常接近1
它看起來像沿着這條線已經報道Sun's bug database一個錯誤,但他們關閉它一個重複的,但他們的鏈接不會去現有的錯誤。它似乎是非常系統特定的,所以我越來越確信這是一個硬件問題。
您可以提供有關您的環境的更多信息:操作系統,硬件,Java版本?我只是在我的機器上運行了你的樣品,它產生了預期的結果(納秒和毫秒每秒增加1,或多或少)。我的環境:Windows XP,Dell Optiplex,Sun JDK 1.6.0_14 – 2009-10-14 19:38:28
不是我的機器,所以我會盡我所能:Windows XP SP3,Core Duo,JDK 1.6。我的猜測是,無論用什麼java來計算nanoTime,這可能都是一個硬件問題,但我試圖看看是否還有其他可能導致它的東西。 – DivineWolfwood 2009-10-14 20:50:49
我試過你的代碼(在Win XP,Core 2 Duo,Sun Java 1.6.0_16上),但是我不能重現這個問題。在我的系統中,納秒/毫秒的時間在0.001秒內。 – Jesper 2009-10-15 08:26:18