Java 8의 메서드 참조 캐싱
Java 8에서는 인스턴스 메서드와 생성자를 참조하기 위한 간결한 구문을 제공하는 메서드 참조를 도입했습니다. 그러나 이러한 참조를 캐싱하는 것이 유익한지에 대한 우려가 있습니다. 이 주제를 이해하려면 동일한 호출 사이트를 자주 실행하기 위한 캐싱 메서드 참조와 서로 다른 호출 사이트에서 메서드 참조를 여러 번 사용하기 위한 캐싱을 구별하는 것이 중요합니다.
메서드 참조 캐싱 동일한 호출 사이트
Foo.func()가 반복적으로 호출되는 다음 코드를 고려하십시오. doSomethingWithAFunc():
class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } }
이::func를 캐싱하면 hotFunction()이 실행될 때마다 새로운 익명 클래스 인스턴스 생성이 제거될 것입니다. 그러나 JVM은 람다의 첫 번째 호출 중에 생성된 호출 사이트 인스턴스를 재사용하여 이미 이 시나리오를 최적화합니다. 이 경우 메서드 참조를 캐싱하는 것은 불필요합니다.
다른 호출 사이트에 대한 메서드 참조 캐싱
반대로 다음 예를 고려하세요.
Runnable r1 = System::gc; Runnable r2 = System::gc;
여기서 두 개의 서로 다른 호출 사이트는 java.lang.System의 동일한 대상 메서드 System.gc()에 대한 메서드 참조를 생성합니다. JVM은 둘 사이에 단일 람다 인스턴스를 공유할 수 있지만 Java 8의 현재 구현에서는 그렇게 하지 않습니다. 이는 람다 인스턴스 캐시를 유지하는 것의 불확실한 성능 이점 때문입니다.
모범 사례
이러한 고려 사항을 고려할 때 일반적으로 메서드 참조를 캐시하는 것은 권장되지 않습니다. 측정을 통해 식별된 특정 성능 문제입니다. 캐싱은 잠재적으로 프로그램 실행 동작을 변경할 수 있으며 다음과 같은 경우에만 고려해야 합니다.
람다는 생성자 또는 클래스 초기화에서 생성되며
위 내용은 Java 8의 메소드 참조 캐싱은 성능 향상을 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!