2009-04-24 3 views
0

BigDecimal에 대해 이야기 할 때 Java 컴파일러가 곱셈을 1 씩 제거합니까?BigDecimal : Java 컴파일러가 곱셈을 1 씩 최적화 할 수 있습니까?

나는이 비슷한 서있어 : 기본적으로 그래서

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

, 상기 getOneTwoOrThree 방법으로 선언

BigDecimal bd = getBigDecimal();//get arbitrary bigDecimal, could be anyone. 

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

.

getOneTwoOrThree()이 1이면 컴파일러에서 곱셈을 수행합니까? 아니면 명령을 무시할 것인가?
이것은 다소 실존 적으로 의심 스럽지만, 나는 어느 정도 초기 단계에 있다고 생각합니다.

답변

4

번호 BigDecimal은 라이브러리 클래스 (java.lang에도 포함되지 않음)이기 때문에 컴파일러는이를 다른 클래스로 취급합니다.

BigDecimal 특별한 경우에는 내부적으로는 가능하지만 분명히 그렇지 않습니다.

(편집 :. 내가는 JIT 컴파일러는 몇 가지 마술을 할 수있을 가능성이 있음을 추가해야합니다,하지만 확실하게 몇 가지 검사를해야 할 것입니다)

난 당신이 코드를 변경하는 것이 만 제안 을 사용하려면 1, 2 및 3이 내부적으로 BigDecimal에 의해 캐시 된 특수한 경우 중 일부이기 때문입니다.

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

여기에는 너무 많은 코드가 인라인이나 다른 것으로 생각됩니다. 나는 JIT가 이것으로 많은 것을 할 수 있다면 매우 놀랄 것이다. 그러나이 구현에서는 1을 곱하는 것이 많은 자릿수 (더 많은 자릿수, 루프 반복 횟수)로 곱하는 것보다 본질적으로 저렴합니다. – erickson

+0

아마 JIT에 맞을 것입니다. BigDecimal의 크기가 작아서 제품이 길어지면 코드 경로가 상당히 짧아집니다. 불행하게도, 거대한 숫자에 1을 곱하면 어려운 경우가됩니다. –

0

함수가 결정적이지 않으면 컴파일시 최적화 할 수 없습니다.