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는 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의 경우 캐시를 사용하지 않고 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 |