我正在開發(fā)一個小型游戲項目,并希望跟蹤時間以處理物理。在瀏覽了不同的方法之后,起初我決定使用 JavaInstant和Duration類,現(xiàn)在切換到 Guava 的Stopwatch實現(xiàn),但是,在我的代碼片段中,這兩種方法在第二次調(diào)用runtime.elapsed(). 從長遠來看,這似乎不是一個大問題,但為什么會發(fā)生這種情況呢?我嘗試在 Windows 和 Linux(Ubuntu 18.04)中以焦點和線程的形式運行下面的代碼,結果保持不變 - 確切的值不同,但出現(xiàn)了差距。我正在使用帶有 JDK 11 的 IntelliJ IDEA 環(huán)境。主要片段: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條經(jīng)驗 獲得超5個贊
您正在調(diào)用返回的 by Duration.getNano()
,這不是您想要的。Duration
elapsed()
a 的內(nèi)部表示Duration
是秒數(shù)加上持續(xù)時間中任何額外的整秒分數(shù)的納米偏移量。Duration.getNano()
返回該納米偏移量,除非您還調(diào)用Duration.getSeconds()
.
您可能想要調(diào)用的方法是toNanos()
,它將整個持續(xù)時間轉換為納秒數(shù)。
編輯:在這種情況下,這并不能解釋你所看到的,因為看起來正在打印的納米偏移量可能都在同一秒內(nèi),但你仍然不應該使用getNano()
.
實際問題可能是在第一次調(diào)用期間必須發(fā)生的類加載或額外工作的某種組合,和/或 JIT 提高未來調(diào)用的性能(盡管我認為循環(huán) 10 次不一定足以讓你看到很多JIT 的任何變化)。
添加回答
舉報
0/150
提交
取消