Java 8 lambdas和匿名内部类之间的性能差异

时间:2014-06-18 20:52:49

标签: java performance closures java-8

在Java 8之前,可以通过使用匿名内部类来实现lambda功能。例如:

interface Lambda {
    void doStuff();
}

// ...

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

// ...

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

就性能而言,仍然使用这种方法和使用新的Java 8 lambdas之间有区别吗?

2 个答案:

答案 0 :(得分:78)

Oracle发布了一项比较Lambdas和匿名类之间性能的研究

请参阅Sergey Kuksenko的JDK 8: Lambda Performance Study,这是长达74张幻灯片。

总结:热身的速度很慢,但是当JIT将最坏的情况列为最快的情况时,就像匿名课一样快,但可以更快。

答案 1 :(得分:-4)

正如我发现的那样,使用Stream迭代数组的工作要慢得多(74张幻灯片不考虑这种情况)。我认为这不是lambda中唯一的性能泄漏(猜测,它将来会有所改进)。以下示例使用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)