在Java中是否有任何性能原因来声明方法参数?
在Java中是否有任何性能原因来声明方法参数?
如:
public void foo(int bar) { ... }
与:
public void foo(final int bar) { ... }
假设bar
只读,并且从不在foo()
修改。
final关键字不会出现在本地variables和参数的类文件中,因此不会影响运行时性能。 它只是用来澄清编码人员意图variables不被改变(许多人认为它的用法可疑的原因),并处理匿名内部类。
关于方法本身的最终修饰符是否具有任何性能增益,还有很多争论,因为无论修饰符如何,这些方法在运行时都会被优化编译器内联。 在这种情况下,它也只能用来限制方法的重写。
最后一个参数的唯一好处是它可以在匿名嵌套类中使用。 如果一个参数从不改变,即使没有最终的修饰符,编译器也会检测到它是正常操作的一部分。 错误是由意外分配的参数引起的 – 如果你的方法足够大以至于需要这个级别的工程,使它们更小 – 你调用的方法不能改变你的参数。
我想不出为什么编译器会关心你是否声明了一个方法参数final的原因。
但是这个问题的真正答案是 – 编写两个函数,一个是最终参数,一个是常规参数。 每运行一百万次,看看是否有明显的运行时差异。
如果您担心性能,那么对代码进行一些性能分析非常重要,并确切了解是什么让速度变慢。 这几乎肯定不是你所期望的:)
在类加载后运行的编译器(如JIT编译器)可以利用最终的方法。 因此,最终宣布的方法可能会有一定的性能优势。
http://www.javaperformancetuning.com/tips/final.shtml
哦,另一个好资源
我build议你不要写微基准。 你不知道JIT可以做什么和什么时候做什么优化,而且你可能会错误地认为它只是做一个“简单的testing用例”
我假设编译器可能会删除所有具有原始types(如int)的私有静态最终variables,并将它们直接embedded到代码中,就像使用C ++macros一样。
但是,如果这是在实践中完成,我不知道,但可以做到这一点,以节省一些记忆。
还有一点,在上面使用方法中声明的非最终局部variables – 内部类实例可能会超出栈帧,所以局部variables可能会消失,而内部对象仍然活着
final
参数是只读的 (意味着对象的身份,而不是它的状态)。