【问题标题】:Why does making a class final speed things up? [duplicate]为什么让课程最终加快速度? [复制]
【发布时间】:2012-01-19 06:49:34
【问题描述】:

可能重复:
Why defining class as final improves JVM performance?

我的项目中有以下课程:

public final class LinkNode
{
  public int value;
  public LinkNode next;

  public LinkNode(int value, LinkNode next)
  {
    this.value = value;
    this.next = next;
  }

  public LinkNode(int value)
  {
    this(value, null);
  }
}

我的代码中最慢的一行(总体上相当复杂)是我构造新的LinkNodes 的地方。

我发现当我创建 final 类时,代码运行速度明显加快。这是为什么呢?

在这个类中我还能做些什么来优化这个类,特别是主构造函数?

(例如,getter/setter 比公共字段快吗?我可以添加其他修饰符吗?等等。)

【问题讨论】:

  • 请。显示您比较的基准测试输出。
  • 哦,我找到了一个相关的问题:stackoverflow.com/questions/3961881/…
  • 你确定它会产生显着的速度差异吗?
  • 不相关。这是您需要的确切答案。对? :-)

标签: java optimization final compiler-optimization


【解决方案1】:

我发现当我将课程设置为 final 时,代码运行速度明显加快。这是为什么呢?

我认为这是因为您的基准测试方法存在缺陷。

假设您使用的是最近的 Hotspot JRE,JIT 编译器足够智能,类上的 final 修饰符应该不会影响性能……除非您在应用程序中实际使用该类的子类。

如果您需要确认,请发布您的方法的详细信息,包括基准代码和基准结果。

【讨论】:

    【解决方案2】:

    声明一个类final直接影响JVM的性能。 final 类和方法可以在加载到 JVM 后内联,因为此时 JVM 肯定知道该方法是 final 的。因此,即时 Java 编译器的性能可能会有所提高。

    您可能需要查看此处提供的链接以获取更多详细信息:http://www.javaperformancetuning.com/tips/final.shtml

    【讨论】:

    • JIT 无论如何都会内联方法并在必要时对其进行反优化。我同意斯蒂芬的解释:有缺陷的测试。
    • 我不会依赖链接页面中的信息。 1)它到处都说“可以”和“会”,这意味着作者在陈述理论而不是事实。 2) 没有参考基准或权威来源。 3) 甚至没有提及 Java 的特定版本/发行版,众所周知,实际性能取决于此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多