2015-09-16 60 views
1

我在Java程序中做了100次對數和功率計算。第二次開始所用的時間(使用System.nanotime())比第一個實例快。爲什麼? Java(我使用JDK8)是否使用任何內存中的緩存來進行數學計算?JVM如何第二次更快地執行數學計算?

+2

Uuless你展示你的代碼,這是一個非常理論的問題。 –

回答

3

在第一次數學計算時,JVM至少需要將Math類從硬盤加載到內存中,驗證它(掃描錯誤)並解析它以提取方法,註釋等。它比計算對數。因此,第一次訪問該類可能比後續訪問慢許多倍。

在進一步的迭代過程中,可以觸發代碼的JIT編譯(所謂堆棧替換),並且您的測試方法將被編譯,因此您可能會因爲調用Math方法而加速更多隻需簡單地用CPU指令代替,減少了將參數傳遞給本地代碼以及解釋迭代工作的開銷。此外,如果您的測試寫得不好,而且您沒有使用計算結果,那麼JIT編譯器可能根本不會調用Math庫。

最後,對於如Math.log這樣的快速方法,碳納米管可能會產生太不精確的結果。考慮寫適當的JMH benchmark

+0

很好解釋! – prageeth

+2

即使在解釋執行中,第二次執行可能會快得多,因爲Oracle的JVM在第一次遇到時會用非標準操作碼替換某些Math方法的調用,以便後續執行甚至可以在解釋器中立即使用專用的CPU指令。 – Holger