BigDecimal: Может ли компилятор Java оптимизировать умножения на 1? - PullRequest
0 голосов
/ 24 апреля 2009

Убирает ли компилятор Java умножения на 1, когда речь идет о BigDecimal?

Я стою в чем-то похожем на это:

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
 }

Итак, в основном.

если getOneTwoOrThree() вернет 1, будет ли компилятор выполнять умножение? Или это не инструкция?
Это в некотором роде экзистенциальное сомнение, но я предполагаю, что я на каком-то уровне рано - оптимизирую.

Ответы [ 2 ]

4 голосов
/ 25 апреля 2009

Нет. BigDecimal - это библиотечный класс (его даже нет в java.lang), поэтому компилятор обрабатывает его как любой другой класс.

BigDecimal может особый случай это внутренне, но, видимо, нет.

( Редактировать: Я должен добавить, что вполне возможно, что JIT-компилятор может творить чудеса, но я должен был бы сделать несколько тестов, чтобы быть уверенным.)

Я бы только предложил изменить код для использования BigDecimal.valueOf(), потому что 1, 2 и 3 - это некоторые из особых случаев, которые внутренне кэшируются BigDecimal.

bd = bd.multiply(BigDecimal.valueOf(getOneTwoOrThree());
0 голосов
/ 11 августа 2010

Если ваша функция не является детерминированной, она все равно не может быть оптимизирована во время компиляции.

...