[英]Java Lambda performance vs declared Suppliers/Functions
我开始学习如何在java8中使用Optional
进行开发。 它可能是有记录的,但我一直在使用谷歌没有准确的结果。
我对orElseGet
方法有不同的可能实现,我不确定java在某些情况下是否会提供更好的内存处理,或者它是否几乎相同。
假设我在类中有一个方法,并且定义了一个Optional
:
class myClass {
final static private Supplier<Object> MY_SUPPLIER = () -> new Object();
private void myMethod1 () {
Optional<Object> x; // somehow Initialized
Object y = x.orElseGet(() -> new Object());
}
private void myMethod2 () {
Optional<Object> x; // somehow Initialized
Object y = x.orElseGet(MY_SUPPLIER);
}
}
从我的谦虚的角度来看,第二个应该在java中有更好的内存管理,因为它只是在Supplier
一次声明,并且总是使用相同的。
1)这是真的吗?
现在,让我们更进一步,想象我们需要根据参数提供不同的对象。
class myClass2 {
final static private Function<String, Supplier<AnyCustomClass>> MY_SUPPLIER_PROVIDER = (p) -> () -> new AnyCustomClass(p);
private void myMethod1 (String arg) {
Optional<AnyCustomClass> x; // somehow Initialized
AnyCustomClass y = x.orElseGet(() -> new AnyCustomClass(arg));
}
private void myMethod2 (String arg) {
Optional<AnyCustomClass> x; // somehow Initialized
AnyCustomClass y = x.orElseGet(MY_SUPPLIER_PROVIDER.apply(arg));
}
}
在这种情况下,根据参数,每次返回不同的供应商。
2)java在这里也有更好的内存管理吗?
3)他们是否以某种方式被“缓存”为具有相同价值的arg?
编辑
通过观察lambda表达式每次执行时都会在堆上创建一个对象吗? 我明白我的第一堂课是回答的。 由于没有局部变量,它将创建一个单例(至少是oracle jvm)
但是,我不觉得那个答案提供准确的信息来回答我的2)和3)
两种方法之间的区别在于您正在重用供应商,供应商将重复使用对象,从而为您节省一些内存。 你需要注意的是线程问题。 由于您使用相同的内存,因此需要确保不同的线程不会尝试使用相同的对象。
那么回答你的问题:
1.)是的,但您可能还有其他问题。
2.)它和第一个问题一样吗? 您正在重用该函数的实例。 这不是你应该在这种情况下使用Function的方式。
3.)它被'缓存',因为函数的实例被重用了。
一般来说,我会远离你的第二个选择,除非这被称为1000 /秒,你交易增加了复杂性,这不会转化为显着的性能。
如果您对性能的影响感兴趣,请编写一个单元测试,在不同的线程上多次调用它并使用分析器监视运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.