[英]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會將其優化為內聯操作以加速它。 如果似乎沒有任何需要,它將不會打擾,更喜歡字節碼編譯速度優於機器代碼優化; 但它是一個兩階段編譯器,第二階段開始更積極地優化它在代碼中檢測到的熱點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.