programing

Double.valueof javadoc에서 캐시하지 않은 값을 캐시한다고 말하는 이유는 무엇입니까?

copyandpastes 2021. 1. 19. 08:20
반응형

Double.valueof javadoc에서 캐시하지 않은 값을 캐시한다고 말하는 이유는 무엇입니까?


OpenJDK에서 메소드 :

public static Double valueOf(double d)

javadoc은 다음과 같이 말합니다.

지정된 double 값을 나타내는 Double 인스턴스를 반환합니다. 새 Double 인스턴스가 필요하지 않은 경우 일반적으로 Double (double) 생성자보다이 메서드를 우선적으로 사용해야합니다.이 메서드는 자주 요청되는 값을 캐싱하여 훨씬 더 나은 공간 및 시간 성능을 제공 할 수 있기 때문입니다.

실제 코드는 다음과 같습니다.

public static Double valueOf(double d) {
    return new Double(d);
}

캐시는 거짓말입니다! 여기서 무슨 일이 일어나고 있습니까?


메소드 IntegerLong, BigDecimal및 기타 유형에 대해 존재 하며 문서는 항상 동일합니다. 일부 상황 (정의되지 않음)에서는 메소드 동일한 결과를 리턴 할 수 있습니다.

AFAIK, 캐싱은 정수 유형에 대해서만 구현되며 -128에서 127 사이의 값 (가장 일반적인 값)에 대해 캐시 된 인스턴스를 반환합니다. 의 경우 BigDecimal캐시는 현재 0에서 10 사이의 값에 대해 작동합니다.

이후 버전의 Java 이 동작을 다른 값 / 추가 유형으로 확장 할 있습니다. 따라서 오늘이 코드를 사용하는 것이 현명합니다. 내일 코드가 더 빨라질 수 있기 때문입니다 (오늘날 코드가 더 느려지지 않을 것입니다).

예를 들어 Java 컴파일러는 오토 박싱 용 코드를 생성 할 때이 API를 사용합니다.


API 문서에는 문제가 없습니다.

이 방법 은 결과 를 낳을 가능성 이 있습니다 ...

즉, 구현은 여기서 캐싱을 수행 할 수 있으며 이는 생성자에서는 불가능합니다. 그러나 반드시 필요한 것은 아닙니다. 그러나 캐싱을 수행하는 구현이있을 가능성이 있으므로 생성자를 사용하는 것보다이 방법을 선호해야합니다.


Java 1.5 이상부터 JVM / JIT는 Integers -127에서 127까지 의 캐싱을 보장합니다 . 따라서 Integer선호되는 접근 방식은 valueOf. 일반적으로 valueOf생성자를 사용하여 사용하는 것이 좋습니다. double그러면 JIT가 적합하다고 판단되는 코드를 최적화 할 수 있기 때문입니다. 예를 들어, 다음 루프를 고려하십시오.

for (Object o: objectList) {
  o.setValue(Double.valueOf(0.0));
}

이 경우 JIT는 이중 객체를 미리 계산하고 루프의 각 반복에서 동일한 값을 재 할당 new Double(0.0);할 수 있지만 사용 하는 경우 에는 그렇게 할 수 없습니다.


API 설계자는 대체 구현을 제한하고 싶지 않았을 것입니다. 이제 Double클래스 에 캐싱을 자유롭게 추가 할 수 있습니다 .


이러한 valueOf()메소드는 캐싱을 지원하기 위해 모든 숫자 유형에 존재합니다. 실제로 Double의 경우 캐시를 사용하지 않고 IntegerLong.


JVM은 임베디드 장치 (대부분)의 코드 크기를 줄이기 위해 만들어졌으며 셋톱 박스 운영 체제입니다. 필자는 몇 가지 임베디드 자바 플랫폼에서 작업 해 왔으며 "valueOf"의 "값"이 더 분명 할 것이며 경우에 따라 상당한 공간을 절약 할 수 있습니다.

대부분의 메서드는 "new"가 캐시 된 인스턴스를 사용할 수 없기 때문에 존재합니다. valueOf는 캐시 된 인스턴스를 사용하도록 구현 될 수 있으며 (그렇지 않으면 항상 new를 사용합니다) 시간을 절약 할 수있는 곳이면 어디에서나 수행 할 수 있습니다.

만약 그들이 (또는 당신이) 그 메소드를 실제로 캐시 값을 수행 한 것으로 대체한다면 모든 코드는 그 변화의 이점을 얻게 될 것입니다. 그러나 "valueOf"와 같은 메소드를 제공함으로써 준비하지 않고서는 결코 일어날 수 없습니다. "새로운"캐시 된 값을 반환하도록 컴파일러 / 바이트 코드 실행기를 조정할 수 있지만 일부 계약을 위반할 것이라고 생각합니다.)

따라서 캐시는 실제로 거짓말이 아니라 마음의 상태 일뿐입니다.

참조 URL : https://stackoverflow.com/questions/8561710/why-does-the-double-valueof-javadoc-say-it-caches-values-when-it-doesnt

반응형