2009-04-24 2 views
0

Является ли компилятор Java удалением умножений на 1, когда речь идет о BigDecimal?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 
} 

Так, в основном.

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

ответ

4

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

BigDecimal специальный корпус это внутренне, но, по-видимому, нет.

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

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

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

Я думаю, что здесь слишком много кода для inline или чего-то еще. Я был бы очень удивлен, если бы JIT мог многое с этим справиться. Однако в этой реализации умножение на единицу по сути дешевле, чем умножение на число с большим количеством цифр (больше цифр, больше итераций цикла). – erickson

+0

Вы, вероятно, прямо на JIT. Я просто заметил, что если BigDecimals достаточно малы, чтобы их продукт вписывался в длинный, путь кода значительно короче. К сожалению, умножение огромного числа на 1 приводит к сложному делу. –

0

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

Смежные вопросы