簡體   English   中英

Java乘法優化

[英]Java Multiplication Optimization

我目前正在研究將有數十萬次迭代的代碼,並想知道現代Java編譯器是否在優化到匯編期間自動處理中間值。 例如,我在循環中有以下代碼(簡化):

arrayA[i] += doubleA*doubleB;
arrayB[i] += doubleA*doubleB;

現代Java編譯器是否“智能”足以將doubleA * doubleB存儲到乘法寄存器中(然后繼續讀取第二個數組的乘法寄存器,避免第二個浮點運算)? 或者,我會更好地使用以下內容:

double product = doubleA*doubleB;
arrayA[i] += product;
arrayB[i] += product;

對於第二種選擇,我主要關注Java垃圾收集器每次超出范圍時處理產品變量的開銷。

如果您運行代碼數百萬次,則代碼很可能是JIT編譯的。 如果您想查看JIT輸出,並驗證它是否是本機編譯的,您可以使用JVM標志啟用它 (您還必須事先編譯庫(由於許可問題,庫未預先打包) )。

當JIT將代碼編譯為本機機器代碼時,它通常會對代碼執行優化。 隨着時間的推移,隨着時間的推移,還有一面旗幟會越來越優化它。 應該注意的是,JIT編譯通常不會發生,直到函數執行了大約10,000次,遺憾的是沒有辦法強制JIT在程序啟動時編譯代碼。 據推測,JIT不應該有任何開銷,它可能會在后台編譯另一個線程的代碼,然后在完成后注入本機代碼(JIT編譯應該只需要不到半秒)。

至於將結果存儲為double,不會對性能產生任何負面影響。 此外,您不需要擔心GC,因為它是一個基本類型,它在堆棧上聲明並在作用域退出后彈出(該變量將在下一個循環迭代中重新聲明)。

你幾乎不知道jit是做什么的,但你可以用javap輕松查看字節碼。 如果javac / ide沒有優化它,我不會假設jit會。 只需編寫好的代碼,無論如何都更容易在眼睛上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM