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);
}
캐시는 거짓말입니다! 여기서 무슨 일이 일어나고 있습니까?
메소드 Integer
는 Long
, BigDecimal
및 기타 유형에 대해 존재 하며 문서는 항상 동일합니다. 일부 상황 (정의되지 않음)에서는 메소드 가 동일한 결과를 리턴 할 수 있습니다.
AFAIK, 캐싱은 정수 유형에 대해서만 구현되며 -128에서 127 사이의 값 (가장 일반적인 값)에 대해 캐시 된 인스턴스를 반환합니다. 의 경우 BigDecimal
캐시는 현재 0에서 10 사이의 값에 대해 작동합니다.
이후 버전의 Java 는 이 동작을 다른 값 / 추가 유형으로 확장 할 수 있습니다. 따라서 오늘이 코드를 사용하는 것이 현명합니다. 내일 코드가 더 빨라질 수 있기 때문입니다 (오늘날 코드가 더 느려지지 않을 것입니다).
예를 들어 Java 컴파일러는 오토 박싱 용 코드를 생성 할 때이 API를 사용합니다.
API 문서에는 문제가 없습니다.
이 방법 은 결과 를 낳을 가능성 이 있습니다 ...
즉, 구현은 여기서 캐싱을 수행 할 수 있으며 이는 생성자에서는 불가능합니다. 그러나 반드시 필요한 것은 아닙니다. 그러나 캐싱을 수행하는 구현이있을 가능성이 있으므로 생성자를 사용하는 것보다이 방법을 선호해야합니다.
Java 1.5 이상부터 JVM / JIT는 Integer
s -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의 경우 캐시를 사용하지 않고 Integer
및 Long
.
JVM은 임베디드 장치 (대부분)의 코드 크기를 줄이기 위해 만들어졌으며 셋톱 박스 운영 체제입니다. 필자는 몇 가지 임베디드 자바 플랫폼에서 작업 해 왔으며 "valueOf"의 "값"이 더 분명 할 것이며 경우에 따라 상당한 공간을 절약 할 수 있습니다.
대부분의 메서드는 "new"가 캐시 된 인스턴스를 사용할 수 없기 때문에 존재합니다. valueOf는 캐시 된 인스턴스를 사용하도록 구현 될 수 있으며 (그렇지 않으면 항상 new를 사용합니다) 시간을 절약 할 수있는 곳이면 어디에서나 수행 할 수 있습니다.
만약 그들이 (또는 당신이) 그 메소드를 실제로 캐시 값을 수행 한 것으로 대체한다면 모든 코드는 그 변화의 이점을 얻게 될 것입니다. 그러나 "valueOf"와 같은 메소드를 제공함으로써 준비하지 않고서는 결코 일어날 수 없습니다. "새로운"캐시 된 값을 반환하도록 컴파일러 / 바이트 코드 실행기를 조정할 수 있지만 일부 계약을 위반할 것이라고 생각합니다.)
따라서 캐시는 실제로 거짓말이 아니라 마음의 상태 일뿐입니다.
'programing' 카테고리의 다른 글
Google Firestore에서 쿼리 커서를 처리하는 올바른 방법(Vue/Nuxt.js) (0) | 2022.07.02 |
---|---|
투명한 중공 또는 잘라낸 원 (0) | 2021.01.19 |
phantomjs“SyntaxError : Parse error”메시지에서 더 많은 정보 얻기 (0) | 2021.01.19 |
Jackson으로 자식 ID 만 직렬화하는 방법 (0) | 2021.01.19 |
양식 데이터를 잃지 않고 현재 페이지를 다시로드하는 방법은 무엇입니까? (0) | 2021.01.19 |