2014-06-18 10 views
42

Przed wersją 8 Java 8 można uzyskać funkcje lambda za pomocą anonimowych klas wewnętrznych. Na przykład:Różnice w wydajności między lambdą w języku Java 8 i anonimowymi klasami wewnętrznymi

interface Lambda { 
    void doStuff(); 
} 

// ... 

public void doWithCallback(Lambda callback) { 
    // ... 
    callback.doStuff(); 
} 

// ... 

doWithCallback(new Lambda { 
    public void doStuff() { 
     // ... 
    } 
}); 

Czy pod względem wydajności nadal stosuje się tę metodę i stosuje nowe lambdy w języku Java 8?

+3

Dlaczego nie tworzyć prostych obliczeń przy użyciu opcji Data dla każdego podejścia? – MGorgon

+1

Czy zastanawiasz się nad tym, czym jest "zamknięcie Java 8"? Przynajmniej w oparciu o to pytanie (https://stackoverflow.com/questions/17204279/does-java-8-support-closures) takie rzeczy nie wydają się istnieć ... – awksp

+1

@ user3580294 Prawdopodobnie nawet anonimowo wewnętrzne klasy tworzą zamknięcia, aczkolwiek w niezmiennym kontekście (zmiennym). Czy ktoś mógłby twierdzić, że Haskell nie ma zamknięć z powodu niezmienności wiązań? Ale w każdym razie ["Wyrażenia Lambda"] (http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html) będzie prawdopodobnie bardziej jasne w kontekście. – user2864740

Odpowiedz

67

Oracle opublikował wyniki badania porównujące między lambda i anonimowe klas

Zobacz JDK 8: Lambda Performance Study Sergey Kuksenko, która wynosi 74 slajdy długo.

Podsumowanie: powoli się rozgrzewa, ale gdy JIT podkreśla najgorszy przypadek, jest tak szybki jak anonimowy, ale może być szybszy.

+1

Wydaje się być slajdami, a nie stronami. Dobre znalezisko. – csvan

+0

@ user2864740 dodano streszczenie 1 zdania, przepraszam trochę zajęło przeczytanie wszystkich slajdów – dkatzel

+21

+1 - W podsumowaniu w jednym zdaniu. – OldCurmudgeon

-2

Jak stwierdziłem, iteracja za pomocą Stream działa dużo wolniej (74 slajdy nie są w tym przypadku brane pod uwagę). Myślę, że to nie jedyne wycieki wydajności w lambdach (zgadnijcie, że będzie to poprawione w przyszłości). Poniższy przykład działa z Java 8 bez żadnych opcji:

//Language is an enum 
    Language[] array = Language.values(); 
    System.err.println(array.length); // 72 items 
    long t = System.nanoTime(); 
    for (Language l : array) System.out.println(l.getLanguageName()); 
    System.err.println(System.nanoTime()-t); //nano time 1864724 

    t = System.nanoTime(); 
    Arrays.stream(array).forEach(v -> System.out.println(v.getLanguageName())); 
    System.err.println(System.nanoTime()-t); //nano time 55812625 (55812625/1864724 = 29.93 times longer) 

    List<Language> list = Arrays.asList(array); 

    t = System.nanoTime(); 
    for (Language l : list) System.out.println(l.getLanguageName()); 
    System.err.println(System.nanoTime()-t); //nano time 1435008 

    t = System.nanoTime(); 
    list.forEach(v -> System.out.println(v.getLanguageName())); 
    System.err.println(System.nanoTime()-t); //nano time 1619973 (1619973/1435008 = 1.128 times longer) 
+4

Miksujesz swoje porównania. Pytanie dotyczyło anonimowych klas przeciwko lambdas, ale porównujesz pętle i strumienie. – Coeffect

Powiązane problemy