>  기사  >  Java  >  Java 8의 메소드 참조 캐싱은 성능 향상을 제공합니까?

Java 8의 메소드 참조 캐싱은 성능 향상을 제공합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-17 06:27:03851검색

Does Method Reference Caching in Java 8 Offer Performance Gains?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.