我正在開發一個小型游戲項目,并希望跟蹤時間以處理物理。在瀏覽了不同的方法之后,起初我決定使用 JavaInstant和Duration類,現在切換到 Guava 的Stopwatch實現,但是,在我的代碼片段中,這兩種方法在第二次調用runtime.elapsed(). 從長遠來看,這似乎不是一個大問題,但為什么會發生這種情況呢?我嘗試在 Windows 和 Linux(Ubuntu 18.04)中以焦點和線程的形式運行下面的代碼,結果保持不變 - 確切的值不同,但出現了差距。我正在使用帶有 JDK 11 的 IntelliJ IDEA 環境。主要片段:public static void main(String[] args) { MassObject[] planets = { new Spaceship(10, 0, 6378000) }; planets[0].run();}這是我的課的一部分MassObject extends Thread:public void run() { // I am using StringBuilder to eliminate flushing delays. StringBuilder output = new StringBuilder(); Stopwatch runtime = Stopwatch.createStarted(); // massObjectList = static List<MassObject>; for (MassObject b : massObjectList) { if(b!=this) calculateGravity(this, b); } for (int i = 0; i < 10; i++) { output.append(runtime.elapsed().getNano()).append("\n"); } System.out.println(output);}標準輸出:30700180700018089001811600181240018133001830200183320018345001835500謝謝你的幫助。
1 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
您正在調用返回的 by Duration.getNano()
,這不是您想要的。Duration
elapsed()
a 的內部表示Duration
是秒數加上持續時間中任何額外的整秒分數的納米偏移量。Duration.getNano()
返回該納米偏移量,除非您還調用Duration.getSeconds()
.
您可能想要調用的方法是toNanos()
,它將整個持續時間轉換為納秒數。
編輯:在這種情況下,這并不能解釋你所看到的,因為看起來正在打印的納米偏移量可能都在同一秒內,但你仍然不應該使用getNano()
.
實際問題可能是在第一次調用期間必須發生的類加載或額外工作的某種組合,和/或 JIT 提高未來調用的性能(盡管我認為循環 10 次不一定足以讓你看到很多JIT 的任何變化)。
添加回答
舉報
0/150
提交
取消