【问题标题】:Java: does lambda usage has negative influence on performance or memory use [duplicate]Java:lambda使用对性能或内存使用有负面影响[重复]
【发布时间】:2020-10-26 13:11:52
【问题描述】:

在 Java 中使用 lambda,例如调用 collection.removeif(item -> item.isOptionSet()) 时,与显式编写相比,对性能或内存使用有任何明显的负面影响

for (Iterator it = collection.iterator(); it.hasNext();) {
  if (it.next().isOptionSet()) {
    it.remove();
  }
}

从性能/内存的角度来看,上面的 lambda 是否类似于

collection.removeIf(new Predicate<Item>() {
  @Override
  public boolean test(Item item) {
    return item.isOptionSet();
  }
});

?

【问题讨论】:

    标签: java lambda


    【解决方案1】:

    在内存方面差别不大。

    就性能而言,这完全取决于 JIT 编译器执行的优化级别,这取决于许多因素,例如正在使用的 Jvm、Jvm 版本以及频率和频率和计数。代码运行。在 lambda 的早期,它们速度较慢,因为 JVM 开发人员尚未能够优化其性能。即使在今天,我也猜想循环是最快的,然后是匿名类,然后是 lambda,但正如我所说,在编译代码中进行了足够的优化(方法倾斜、堆栈分配等),你最终可能会得到同样的结果。

    【讨论】:

    • 我原以为匿名类是最慢的。但是字节码级别的我还没看。
    • 好吧,匿名类确实引入了虚方法调用,但即使这样,当 jit 意识到调用不可能被子类型覆盖时,jit 将内联方法,此时代码可能看起来与循环相同。这是 JVM 运行时的机器码级别,而不是字节码级别。
    猜你喜欢
    • 2014-02-09
    • 2017-06-12
    • 2011-03-15
    • 2013-09-20
    • 2016-10-22
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多