2013-09-26 25 views
1

当我使用像过滤收集小操作匿名类,有在Java 8中的新的匿名类实例或关闭内存分配重复使用Java的关闭/匿名类来提高性能?

String firstNonEmpty = Lists.find(list, new Predicate<String>(){ 
    public String apply(String s){ return !s.isEmpty();} 
}); 

我应该重用这样的断言或Java中8封闭?总是/在一个循环中/在一个无GC的方法中?

+2

像这样的小物件的分配很便宜,很少值得担心。 –

+0

可能重复[效率的Java“双Brace初始化”?](http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization) – assylias

+0

可能是在一个部分,它是无效的为平凡的操作创建一个匿名类。在关闭效率方面似乎有很大的不同。 –

回答

5

创建许多小对象接近于免费(分配和GC),但要注意GC会更频繁地运行,因此与其相关的性能成本略有降低。创建匿名内部类也有特定的问题 - this question有几个解决方案的答案。

但是创造一个lambda,如:

String firstNonEmpty = Lists.find(list, (s) -> !s.isEmpty()); 

不一定创建新的对象。特别是对于像那样的无状态lambda,JVM应该只创建一个lambda“对象”并重用它。

+0

这会在磁盘上创建一个类文件吗? –

+0

当检查字节码和生成的类时,我发现它向现有的类添加了一个方法,但没有创建新的类 - 然而,lambda调用网站使用invokedynamic,我不能100%确定运行时会发生什么。有关更多详细信息和性能数据,另请参阅[本演示文稿](http://wiki.jvmlangsummit.com/images/7/7b/Goetz-jvmls-lambda.pdf)。 – assylias

+1

“最差情况下的lambda数字等于内部类,最好的情况下数字好多了”谢谢 –