【问题标题】:Why can adding a final method modifier reduce code efficiency?为什么添加 final 方法修饰符会降低代码效率?
【发布时间】:2017-01-28 17:09:41
【问题描述】:

我的老师说我们可以使用final来提高效率。我试过做测试,但发现添加final方法修饰符实际上会降低效率。

我的测试是这样的:

ClassTest1:

public class ClassTest1 {
  public final String getName() {
    return name;
  } 
  public final void setName(String name) {
    this.name = name;
  } 
  private   String  name;
}

ClassTest2:

public class ClassTest2 {
  public   String getName() {
    return name;
  } 
  public   void setName(String name) {
    this.name = name;
  } 
  private String  name;
}

主要测试方法:

public static void main(String[] args) {
    ClassTest1 ct1=new ClassTest1();
    ClassTest2 ct2=new ClassTest2();
    Long t1=System.currentTimeMillis();
    for (int i = 0; i <1000000 ; i++) {
        ct1.getName();
    }
    Long t2=System.currentTimeMillis();
    for (int i = 0; i <1000000 ; i++) {
        ct2.getName();
    }
    Long t3=System.currentTimeMillis();
    System.out.println("add final decorate cost time:"+(t2-t1));
    System.out.println("not add final decorate cost time:"+(t3-t2));
}

为什么添加 final 比不添加 final 方法花费更多时间?

【问题讨论】:

  • 将final关键字添加到方法的签名中可以防止它在任何子类中被覆盖,效率与此绝对无关。
  • final 不能让事情变慢。它通常也不会让事情变得更快 - 在大多数情况下,当某些事情有效地final 时,编译器可以解决。 final 用于使代码更可读
  • 您没有添加 jvm 预热,因此将测试更改为以 final 作为第二个执行版本应该会改变结果
  • @Sarly 查看其他 cmets;您的基准测试存在根本缺陷。
  • @k5_,你能告诉我如何添加 jvm 预热吗?我听不懂你在说什么。

标签: java


【解决方案1】:

这里有两个方面:

  • 衡量 Java 性能很难,请参阅here。很可能,您的数字根本不正确
  • 正如 cmets 所说:final 方法只影响是否它们可以被覆盖。从理论上讲,这可以影响运行时性能。当 JIT 编译器知道一个方法不能被覆盖时,它可以决定直接内联方法体,而不需要任何额外的检查。当方法不是最终方法时,执行基本方法的内联体可能是错误的,因此在所述执行之前需要进行某种检查。

归结为:如果有的话,使用该关键字有助于避免在调用该方法时在运行时进行单次检查。从这个意义上说,我们可能正在谈论纳秒的收益。

所以,是的,运行时性能有一个理论方面,但是 final 的实际用法是向人类读者传达意图 .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2015-03-15
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多