2009-04-24 30 views
0

在談論BigDecimal時,Java編譯器是否將乘法運算刪除1?BigDecimal:Java編譯器能否優化乘以1?

我站在類似於此:

BigDecimal bd = getBigDecimal();//get arbitrary bigDecimal, could be anyone. 

bd = bd.multiply(new BigDecimal(getOneTwoOrThree()); 

凡getOneTwoOrThree方法聲明爲:

/* 
* Always returns Integers 1, 2 or 3. 
*/ 
Integer getOneTwoOrThree(){ 
    //some code 
} 

所以,基本上。

if getOneTwoOrThree() returns 1,the compiler will perform the multiplication?或者它會不遵守指示?
這是有點存在的懷疑,但我想我在某個層面早 - 優化。

回答

4

編號BigDecimal是一個庫類(它甚至不在java.lang),所以編譯器將它視爲任何其他類。

BigDecimal可能特殊情況在內部,但顯然沒有。

編輯:我要補充,這是可能的,JIT編譯器可以工作一些魔術,但我會做一些測試,以確保)

我只能建議你改變你的代碼使用BigDecimal.valueOf(),因爲1,2和3是由BigDecimal內部高速緩存的一些特殊情況。

bd = bd.multiply(BigDecimal.valueOf(getOneTwoOrThree()); 
+0

我認爲這裏有太多的代碼來內聯或任何東西。如果JIT能夠做到這一點,我會非常驚訝。然而,在這個實現中,乘以1本質上比乘以具有許多數字的數字(更多數字,更多循環的迭代)便宜。 – erickson 2009-04-24 20:21:57

0

如果你的函數不是確定性的,它在編譯時無法優化。