簡體   English   中英

為什么Math.max在Java中如此昂貴?

[英]Why is Math.max so expensive in Java?

我想做以下事情

int sum = x+y;
sum = Math.max(sum,x);

但是這行代碼往往需要更長的時間

int sum = x+y;
if(x>sum)sum=x;

我希望這不是不恰當的問題,但有人可以解釋為什么會這樣嗎?

我已經查看了源代碼,所有Java都在做

return (a >= b) ? a : b;

也許是因為Java的Math類是第一次像任何其他Singleton或類似的東西一樣被創建,因為在此之前沒有人使用它,就像類加載器操作一樣。

方法調用不是免費的(甚至忽略了Roey指出的潛在類加載):它們涉及在堆棧上推送參數和返回地址,跳轉到代碼中的不同位置,從堆棧中彈出參數,執行工作,將結果推到堆棧上,跳回來,然后將結果彈出堆棧。

但是 ,我懷疑你會發現如果你的代碼中的熱點中有一個Math.max調用(一個運行很多的地方),Oracle的JVM的JIT會將其優化為內聯操作以加速它。 如果似乎沒有任何需要,它將不會打擾,更喜歡字節碼編譯速度優於機器代碼優化; 但它是一個兩階段編譯器,第二階段開始更積極地優化它在代碼中檢測到的熱點。

Java中的微基准測試通常是一項非常艱苦的工作。 這個例子和陳述不能一概而論,像往常一樣,你的問題的答案是“它取決於”。 )。 首先,您在Math.max的JDK實現中看到的源代碼是默認值,在現代硬件上根本不使用。 編譯器用CPU操作替換此調用。 在這里閱讀更多。

這當然不能回答你的問題,為什么你的代碼現在“更快”。 可能它根本沒有執行,因為死代碼消除,編譯器功能。 你能給我們一些周圍的代碼嗎? 關於調用頻率的詳細信息也很有用。 有關硬件的詳細信息。 非常重要:如果進行“測量”,請禁用所有節電功能和所有后台任務。 最好是使用像JMH Cheers Benni這樣的東西

暫無
暫無

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

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