2013-09-26 8 views
1
내가 컬렉션을 필터링 같은 작은 작업을위한 익명 클래스를 사용

성능을 위해 Java 클로저/익명 클래스를 다시 사용 하시겠습니까?

String firstNonEmpty = Lists.find(list, new Predicate<String>(){ 
    public String apply(String s){ return !s.isEmpty();} 
}); 

내가 그런 조건이나 자바 8 폐쇄를 재사용해야 자바 8의 새로운 익명의 클래스 인스턴스 또는 폐쇄를위한 메모리 할당이 ? 항상 /주기/GC없는 방법?

+2

작은 개체를 할당하면 값이 싸기 때문에 걱정할 필요가 거의 없습니다. –

+0

[Java의 효율성 "이중 브레이스 초기화"?] (http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization) – assylias

+0

유효하지 않은 부분에서 예일 수 있습니다. 사소한 조작을 위해 익명의 클래스를 생성한다. 폐쇄 효율이있는 부분에서는 매우 다른 것처럼 보입니다. –

답변

5

많은 작은 개체를 만드는 것이 무료 (할당 및 GC)에 가까우며 GC가 더 자주 실행된다는 경고와 함께 약간의 성능 비용이 있습니다. 익명의 내부 클래스를 만들 때도 특정 문제가 발생합니다. this question에는 해당 부분을 처리하는 몇 가지 답변이 있습니다.

그러나 같이 람다를 만드는 :
String firstNonEmpty = Lists.find(list, (s) -> !s.isEmpty()); 

반드시 새로운 객체를 생성하지 않습니다. 특히, 그와 같은 무국적 람다의 경우, JVM은 람다 "객체"를 하나만 만들어서 재사용해야합니다.

+0

이렇게하면 디스크에 클래스 파일이 생성됩니까? –

+0

바이트 코드와 생성 된 클래스를 검사 할 때 기존 클래스에 메소드를 추가했지만 새로운 클래스는 생성하지 않는다는 것을 알았습니다. - 그러나 lambda 호출 사이트는 invokedynamic을 사용하며 런타임시 발생하는 일을 100 % 확신하지는 않습니다. 자세한 내용과 성능 수치는 [이 프레젠테이션] (http://wiki.jvmlangsummit.com/images/7/7b/Goetz-jvmls-lambda.pdf)을 참조하십시오. – assylias

+1

"최악의 경우의 람다 숫자가 내부 클래스와 같고, 가장 좋은 숫자가 훨씬 낫다."고맙습니다. –