繁体   English   中英

Java Lambda性能与声明的供应商/功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM