Java 8 lambda和匿名内部类之间的性能差异
在Java 8之前,可以通过使用匿名内部类来实现lambdafunction。 例如:
interface Lambda { void doStuff(); } // ... public void doWithCallback(Lambda callback) { // ... callback.doStuff(); } // ... doWithCallback(new Lambda { public void doStuff() { // ... } });
在性能方面,仍然使用这种方法和使用新的Java 8 lambdaexpression式有什么区别?
甲骨文已经发布了一项研究,比较兰姆达斯和匿名类之间的performance
请参阅由谢尔盖•库克科(Sergey Kuksenko)撰写的JDK 8:Lambda性能研究 ,其长度为74张幻灯片。
总结:缓慢的热身,但是当JIT把最坏的情况和匿名类一样快时,速度可能会更快。
正如我所发现的,用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)