Java方法中使用final关键字对性能有影响吗?

3

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);
}

如果我确定我永远不需要在这里传递可修改的变量,那么我应该使用这种技术吗?

1
据我所知,使用final修饰符可以进行优化,但是这里节省的时间非常少,不值得。如果您真的想提高应用程序的性能,请使用分析器来检测真正的瓶颈。 - Luiggi Mendoza
1
这也可能高度依赖于编译器以及JVM和JIT编译器。 - nanofarad
8
我希望我能够对Luiggi的评论进行负评。 - Steve Kuo
2
使用或不使用final有很多原因,与性能无关。为什么要关注性能呢? - user395760
1
我不认为这是重复的。这与将final用作参数有关,而那是针对常规变量的。 - Stephen D
3个回答

9
理论上,声明一个参数为final并不会有什么区别:编译器可以聪明到自己判断你的方法不会改变limit参数,并按照参数已经被声明为final的方式优化生成的代码。
通过声明方法参数为final,最大的区别在于可以在匿名类中引用该参数。
另一个有用的后果是,接手你代码维护的人会知道保持参数不变是你有意为之,而不是巧合。

2
哪个编译器?你可以用来源来支持你的答案吗? - phreakhead

3

目前的Java编译器已经具备了良好的数据流分析功能,因此声明一个不可更改的参数并没有什么用处。只有愚笨的编译器才可能需要这种声明。

然而,对于读者来说,这是一个不错的提示。毕竟代码只需要写一次,但常常需要阅读。

通常,在一些风格指南中规定“参数不应该被覆盖”,这也是一个更好的原因。在内部类中使用时,方法上下文要求参数和局部变量必须是final。

然而,一个不能被重写的final方法确实有优化潜力。

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

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

2
一个未被覆盖且非 final 的方法和一个 final 方法一样可能被内联。JIT 编译器不会考虑 final。 - Steve Kuo
2
@SteveKuo 是的,在JIT级别上,在运行时。但是,静态优化编译器可以在其调用时填充公共最终和私有(=最终)函数的函数体。如果函数以对参数进行空值检查开头,则该检查通常可以解决等问题。 - Joop Eggen

3

1
提供的链接已经失效。 - bazeusz
链接对我来说很好用。 - Vignesh Vino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接