2012-04-05 135 views
0

我在我的應用程序中使用system.nanoTime,並計算相對於啓動時間的時間。
我的應用程序運行得非常好,直到我將它複製到新計算機上,並且納米時間給了我更慢的值。java - system.nanoTime()運行速度太慢

我寫了一個簡單的應用程序來確保。
將納秒時間與系統時間進行比較。
它顯示除了我的新計算機以外的其他計算機中的相同值。有什麼建議麼?

這裏是我的代碼: 首先我

private long initNanoTime = System.nanoTime(); 
private long initTime = System.currentTimeMillis(); 

比我循環運行每秒線程:

long timeUsingNanoTime = initTime + (System.nanoTime() - initNanoTime)/1000000; 
long timeUsingMilis = System.currentTimeMillis(); 
long nanotimeOffset = Math.abs(timeUsingNanoTime - timeUsingMilis); 
if (nanotimeOffset < 100l) ? print("close") : print(far); 

編輯:我使用的納米,因爲我需要處理甚至TS在納米時間內發生,並將其接收到的納米時間打印到日誌中

+1

你是什麼意思「給我慢的值」。方法執行是否需要更多時間,或者您獲得了您不期望的值?也許這可以幫助你http://stackoverflow.com/questions/351565/system-currenttimemillis-vs-system-nanotime – SWoeste 2012-04-05 10:28:24

回答

6

這就像Java API文檔所說的關於System.nanoTime()

此方法只能用於測量已用時間,而不是與系統或掛鐘時間的任何其他概念相關的 。返回的值 表示自一些固定但任意的起點 時間(可能在未來,因此值可能爲負)後的納秒。該方法的所有調用在 Java虛擬機的實例中都使用相同的 源;其他虛擬機實例可能會使用不同的來源。

此方法提供納秒的精度,但不一定 納秒級分辨率(即頻率變化值) - 沒有 擔保除了分辨率至少不如 說的currentTimeMillis()的製作。

它不提供與時間戳(currentTimeMillis)的任何耦合,並且不提供固定分辨率。

在你的情況看來,Java現在有一個比以前更高的分辨率定時器,因此不需要使用系統時間。

+0

是比6和5版本的nanotime更可靠http://docs.oracle.com/javase /6/docs/api/java/lang/System.html#nanoTime%28%29 – Jeb 2012-04-05 10:47:39

+0

他們都說基本相同。兩者都聲明'nanoTime'沒有耦合到任何特定的原點,所以你不能依賴它。他們只是在Java7文檔中添加了更多的解釋。 – Neet 2012-04-05 10:49:47