2009-04-24 10 views
0

BigDecimalについて話すとき、Javaコンパイラは乗算を1つ取り除きますか?BigDecimal:Javaコンパイラは乗算を1だけ最適化できますか?

私はこれに似た何かに立っている:

getOneTwoOrThree方法は次のように宣言されている
BigDecimal bd = getBigDecimal();//get arbitrary bigDecimal, could be anyone. 

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

:基本的には、そう

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

getOneTwoOrThree()が1の場合、コンパイラは乗算を実行しますか?それとも命令がないのでしょうか?
これは多少の存在の疑いですが、私はあるレベルで早期に最適化していると思います。

答えて

4

番号BigDecimalはライブラリクラスです(java.langにも含まれていません)ので、コンパイラはこれを他のクラスとみなします。

BigDecimal特殊ケースの場合はこれは内部的にはそうですが、明らかにそうではありません。

編集:私はそれがJITコンパイラは、いくつかの魔法を働く可能性がありますが、私は確かにいくつかのテストをしなければならないであろうと追加する必要があります)

私はあなたのコードを変更することのみを示唆していますBigDecimalによって内部的にキャッシュされる特殊なケースの1つ、1,2,3があるため、BigDecimal.valueOf()を使用するようにしてください。

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

インラインまたはそれ以上にコードが多すぎると思います。 JITがこれで大いに役立つなら、私は非常に驚くだろう。しかし、この実装では、1を掛けることは、多くの桁数(より多くの桁数、ループの繰り返し回数)で乗算するよりも本質的に安いです。 – erickson

+0

あなたはおそらくJITにいるでしょう。 BigDecimalのサイズが小さくて、その製品が長持ちするのであれば、コードのパスはかなり短くなることに気づいていただけです。残念ながら、巨大な数字に1を掛けると、ハードケースが発生します。 –

0

関数が確定的でない場合は、コンパイル時に最適化することはできません。

関連する問題