当前位置: 首页 > 知识库问答 >
问题:

Lambda与匿名内部类性能:减少类加载器上的负载?

平俊茂
2023-03-14

我想知道lambdas在Java 8中有多大的优势。我同意有时使用lambdas可能更具可读性,但它真的对性能有这么大的影响吗?还是主要集中在句法上?有时我更喜欢匿名的内部类;如果我不一直使用lambda,我真的会失去很多好处吗?

唯一的?大的在我看来,性能增益在于我们实际上并不创建类加载器必须在程序开始时加载的类——例如创建许多线程:

Thread t = new Thread(new Runnable() {
   public.....
});

创建类,如示例$1。类。

除此之外,除了代码的可读性或可维护性等,是否还有其他性能或隐藏增益?隐藏在JVM中的某个地方?我见过与此类似的问题,但大多数问题都集中在视觉方面;我对此不感兴趣。在观看了Venkat Subramaniam对Java 8 Lambdas的黑客攻击之后,这个问题是出于好奇。

共有2个答案

司宏伯
2023-03-14

在阅读了@Brett Okken链接的PDF后,我认为以下观点成立:

  • 内部类在第一次使用时性能稍慢,但似乎可以忽略。
  • Lambdas在经常调用时性能较慢,因为它们在调用时建立了更大的堆栈。

我将坚持以下观点:

  • 当几毫秒的性能损失不是问题(GUI之类)时,使用Lambdas以提高可读性
  • 对经常调用的性能关键型函数使用内部类
帅德惠
2023-03-14

Oracle的演示文稿涵盖了一些性能差异。与匿名类相比,影响lambdas性能的因素似乎很多。

http://www.oracle.com/technetwork/java/jvmls2013kuksen-2014088.pdf

 类似资料:
  • 问题内容: 我想知道lambda在Java 8中有多大的好处。我同意有时使用lambda可能更具可读性,但是它对性能方面真的有很大影响吗?还是主要集中在语法糖上? 有时我更喜欢匿名内部类。 当我一直不使用lambda时,我真的会失去很多好处吗? 唯一的?大?在我看来,性能提升是因为我们实际上并没有创建类加载器必须在程序开始时加载的类,例如创建许多线程: 创建类似的类。 除此之外, 除了代码的可读性

  • 问题内容: 在进行一些基本的lambda练习时,一个看似完全相同的匿名内部类的输出给我的输出与lambda不同。 场景1 输出 2 和 2 。这里没有新内容。 但是当我这样做时: 场景2 输出 2 和 3 问题:两个输出不应该相同吗? 我想念什么吗? 为了完整起见: 方案3 输出 3 和 3 。这里也没有什么新鲜的。 更新:仍从1.8.0-b132获得相同的输出 更新#2:错误报告: https

  • 问题内容: 在Java 8之前,可以通过使用匿名内部类来实现lambda功能。例如: 在性能方面,仍然使用这种方法和使用新的Java 8 lambda之间有区别吗? 问题答案: 甲骨文发布了一项研究,比较了Lambda和匿名类之间的性能 请参见Sergey Kuksenko撰写的JDK 8:Lambda性能研究 ,该幻灯片长74张。 简介:预热缓慢,但是当JIT内联时,最坏的情况与匿名类一样快,但

  • 下面的代码可以工作,但我收到了SonarLint的通知,因为我在流中使用了匿名类而不是lambda表达式,我不知道如何改进下面的代码来避免通知: 代码解释:我使用java.util的属性类,不幸的是,属性的返回

  • 问题内容: 在此问题中用户@Holger提供了一个答案,该答案显示了匿名类的不常见用法,我并不知道。 该答案使用流,但是此问题与流无关,因为这种匿名类型构造可以在其他上下文中使用,即: 令我惊讶的是,它编译并打印了预期的输出。 注意:我很清楚,自古以来,就可以构造一个匿名内部类并按如下方式使用其成员: 但是,这不是我要问的。我的情况有所不同,因为匿名类型是通过方法链传播的。 现在,我可以想象到此功

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除