亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么特定 Guava Stopwatch.elapsed() 調用比其他調用晚得多?

為什么特定 Guava Stopwatch.elapsed() 調用比其他調用晚得多?

Qyouu 2022-11-02 17:21:28
我正在開發一個小型游戲項目,并希望跟蹤時間以處理物理。在瀏覽了不同的方法之后,起初我決定使用 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(),這不是您想要的。Durationelapsed()

a 的內部表示Duration秒數加上持續時間中任何額外的整秒分數的納米偏移量。Duration.getNano()返回該納米偏移量,除非您還調用Duration.getSeconds().

您可能想要調用的方法是toNanos(),它將整個持續時間轉換為納秒數。

編輯:在這種情況下,這并不能解釋你所看到的,因為看起來正在打印的納米偏移量可能都在同一秒內,但你仍然不應該使用getNano().

實際問題可能是在第一次調用期間必須發生的類加載或額外工作的某種組合,和/或 JIT 提高未來調用的性能(盡管我認為循環 10 次不一定足以讓你看到很多JIT 的任何變化)。


查看完整回答
反對 回復 2022-11-02
  • 1 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號