为什么添加最终方法修饰符会降低代码效率?

时间:2017-01-28 17:09:41

标签: java

我的老师说我们可以使用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比不添加最终方法花费更多时间?

1 个答案:

答案 0 :(得分:2)

这里有两个方面:

  • 衡量Java性能非常困难,请参见here。很可能您的电话号码不是声音
  • 正如评论所言:方法的 final 仅影响是否可以覆盖它们。从理论上讲,可以影响运行时性能。当JIT编译器知道时,方法不能被覆盖,它可以决定直接内联方法主体,而无需进行任何其他检查。当方法不是最终方法时,执行基本方法的内联主体可能是错误的,因此在执行之前必须进行某种检查。

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

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