2014-06-18 14 views
42

Prima di Java 8, la funzionalità lambda poteva essere ottenuta utilizzando classi interne anonime. Per esempio:Differenza di prestazioni tra Java 8 lambdas e classi interne anonime

interface Lambda { 
    void doStuff(); 
} 

// ... 

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

// ... 

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

In termini di prestazioni, v'è una differenza tra ancora utilizzando questo approccio e con il nuovo Java 8 lambda?

+3

Perché non creare semplici calcoli utilizzando la Data per ciascun approccio? – MGorgon

+1

Ti spiace espandersi su cosa sia una "chiusura Java 8"? Almeno basato su [questo] (https://stackoverflow.com/questions/17204279/does-java-8-support-closures) domanda che una cosa del genere non sembra esistere ... – awksp

+1

@ user3580294 Probabilmente, anche anonimo le classi interne creano chiusure, anche se in un contesto (variabile) vincolante immutabile. Si potrebbe obiettare che Haskell non ha chiusure dovute all'immutabilità delle associazioni ..? Ma, in ogni caso ["Lambda Expressions"] (http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html) sarebbe probabilmente più chiaro nel contesto. – user2864740

risposta

67

Oracle ha pubblicato un confronto tra le prestazioni di studio tra le lambda e classi anonime

Vedi JDK 8: Lambda Performance Study da Sergey Kuksenko, che è lungo 74 diapositive.

Riassunto: lento a scaldarsi ma quando JIT lo inserisce nel peggiore dei casi veloce come una classe anonima, ma può essere più veloce.

+1

Sembra essere una diapositiva, non una pagina. Buona scoperta – csvan

+0

@ user2864740 aggiunto 1 riepilogo frase, mi dispiace un po 'di tempo per leggere tutte le diapositive – dkatzel

+21

+1 - Per il riepilogo di una frase. – OldCurmudgeon

-2

Come ho trovato, l'iterazione su array con Stream funziona molto più lentamente (74 diapositive non sono considerate tali nel caso). Penso che non sia l'unica perdita di prestazioni in lambda (suppongo, sarà migliorata in futuro). L'esempio seguente era in esecuzione con Java 8 senza opzioni:

//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

Stai mescolando i tuoi confronti. La domanda riguardava le classi anonime vs lambda, ma le hai confrontate per loop e stream. – Coeffect

Problemi correlati