在Java方法性能中使用final关键字?

时间:2013-08-09 15:40:24

标签: java performance variables compiler-construction final

方法参数中的use final是否允许编译器或运行时环境更快地运行?例如,如果您有一个变量要传递给您知道不会被修改并按原样使用的方法,那么声明它final会更有效吗?

实施例: 第一种方法应该比第二种方法更快

public int isLargerAfterTripledFaster(int num, final int limit) {
    num *= 3;
    return (num > limit);
}

public int isLargerAfterTripled(int num, int limit) {
    num *= 3;
    return (num > limit);
}

如果我可以肯定我永远不想在这里传递一个可修改的变量,我应该采用这种技术吗?

3 个答案:

答案 0 :(得分:8)

理论上,声明参数final不会产生任何影响:允许编译器足够智能,以确定您的方法不会更改limit参数,并优化代码如果参数在没有实际声明的情况下声明为final,则会生成它。

通过声明方法参数final,您将获得的最大区别是能够在匿名类中引用该参数。

另一个有用的结果是,在您知道保持该参数不变之后维护代码的人是您有意识的决定,而不是巧合。

答案 1 :(得分:3)

当前的java编译器已经做了很好的数据流分析,它是一个具有不可变参数的声明。只有愚蠢的编译器可以使用它。

对于读者来说,这是一个很好的暗示。代码写入一次,经常阅读。

一般来说,它是由一些风格指南强制执行的,并说“永远不应该覆盖参数”。

更好的理由是在内部类中使用,因为方法上下文需要参数和局部变量是最终的。

然而最后一种方法;一个不能覆盖的人具有优化潜力。

public final int isLargerAfterTripled(int num, int limit) { ... }

编译器可以内联函数代码,因为该方法永远不会被覆盖。

答案 2 :(得分:2)

final对性能完全没有影响。 JIT编译器根本不考虑final。

另请查看Brian Goetz's article on Java final