Подтвердить что ты не робот

Разница в производительности между Java 8 lambdas и анонимными внутренними классами

До Java 8 функциональность лямбда могла быть достигнута с помощью анонимных внутренних классов. Например:

interface Lambda {
    void doStuff();
}

// ...

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

// ...

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

Что касается производительности, существует ли разница между использованием этого подхода и использованием новых jambdas Java 8?

4b9b3361

Ответ 1

Oracle опубликовала исследование, сравнивающее производительность между Lambdas и анонимными классами

См. JDK 8: Исследование эффективности лямбды Сергея Куксенко, которое длится 74 слайда.

Сводка: медленное прогревание, но когда JIT строит в худшем случае так же быстро, как анонимный класс, но может быть быстрее.

Ответ 2

Как я нашел, итерация по массиву с помощью Stream работает намного медленнее (74 слайда не учитывают такой случай). Я думаю, что это не единственная утечка производительности в лямбдах (предположим, в будущем она будет улучшена). Пример ниже выполнялся с Java 8 без каких-либо параметров:

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