0

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
 }

だから基本的に。

1を返す場合getOneTwoOrThree()、コンパイラは乗算を実行しますか?それとも命令を無視しますか?
これは実存的な疑問ですが、私はある程度初期段階にあると思います-最適化。

4

2 に答える 2

4

いいえ。BigDecimalはライブラリクラスであるため(に含まれていませんjava.lang)、コンパイラはそれを他のクラスと同じように扱います。

BigDecimal これを内部で特殊なケースにすることはできますが、そうではないようです。

編集: JITコンパイラーが魔法のように動作する可能性があることを追加する必要がありますが、確実にするためにいくつかのテストを行う必要があります。)

BigDecimal.valueOf()1、2、および3は、によって内部的にキャッシュされる特殊なケースの一部であるため、を使用するようにコードを変更することをお勧めしますBigDecimal

bd = bd.multiply(BigDecimal.valueOf(getOneTwoOrThree());
于 2009-04-24T20:00:08.540 に答える
0

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

于 2010-08-11T13:05:27.707 に答える