2009-04-24 63 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

如果你的函数不是确定性的,它在编译时无法优化。