final对于访问效率的影响
来源:互联网 发布:网络教育 概念股 编辑:程序博客网 时间:2024/05/17 20:26
在能够通过编译的前提下,无论局部变量声明时带不带final关键字修饰,对其访问的效率都一样。
并且:重复访问一个局部变量比重复访问一个成员或静态变量快;即便将其final修饰符去掉,效果也一样。
例如说,以下代码:static int foo() { int a = someValueA(); int b = someValueB(); return a + b; // 这里访问局部变量}
与带final的版本:
static int foo() { final int a = someValueA(); final int b = someValueB(); return a + b; // 这里访问局部变量}
效果一模一样,由javac编译得到的字节码会是这样:
invokestatic someValueA:()Iistore_0 // 设置a的值invokestatic someValueB:()Iistore_1 // 设置b的值iload_0 // 读取a的值iload_1 // 读取b的值iaddireturn
字节码里没有任何东西能体现出局部变量的final与否,Class文件里除字节码(Code属性)外的辅助数据结构也没有记录任何体现final的信息。既然带不带final的局部变量在编译到Class文件后都一样了,其访问效率必然一样高,JVM不可能有办法知道什么局部变量原本是用final修饰来声明的。
但有一个例外,那就是声明的“局部变量”并不是一个变量,而是编译时常量的情况:static int foo2() { final int a = 2; // 声明常量a final int b = 3; // 声明常量b return a + b; // 常量表达式}
Chapter 4. Types, Values, and Variables
其访问会按照Java语言对常量表达式的规定而做常量折叠。
Chapter 15. Expressions
实际效果跟这样的代码一样:
static int foo3() { return 5;}
由javac编译得到对应的字节码会是:
iconst_5 // 常量折叠了,没有“访问局部变量”ireturn
而这种情况如果去掉final修饰,那么a和b就会被看作普通的局部变量而不是常量表达式,在字节码层面上的效果会不一样
static int foo4() { int a = 2; int b = 3; return a + b;}
就会编译为:
iconst_2istore_0 // 设置a的值iconst_3istore_1 // 设置b的值iload_0 // 读取a的值iload_1 // 读取b的值iaddireturn
但其实这种层面上的差异只对比较简易的JVM影响较大,因为这样的VM对解释器的依赖较大,原本Class文件里的字节码是怎样的它就怎么执行;对高性能的JVM(例如HotSpot、J9等)则没啥影响。这种程度的差异在经过好的JIT编译器处理后又会被消除掉,上例中无论是 foo3() 还是 foo4() 经过JIT编译都一样能被折叠为常量5。
Android里的Dalvik VM虽然是个比较简单的VM,但Android开发套件里的dexopt也可以用来处理这种final的局部“常量”与“变量”的差异,所以实际性能也不会受多少影响。
还有,先把成员或静态变量读到局部变量里保持一定程度的一致性,例如:在同一个方法里连续两次访问静态变量A.x可能会得到不一样的值,因为可能会有并发读写;但如果先有final int x = A.x然后连续两次访问局部变量x的话,那读到的值肯定会是一样的。这种做法的好处通常在有数据竞态但略微不同步没什么问题的场景下,例如说有损计数器之类的。
最后,其实很多人用这种写法的时候根本就没想那么多吧。多半就是为了把代码写短一点,为了把一串很长的名字弄成一个短一点的而把成员或静态变量读到局部变量里,顺便为了避免自己手滑在后面改写了局部变量里最初读到的值而加上final来让编译器(javac之类)检查。- final对于访问效率的影响
- final对于访问效率的影响
- final对于访问效率的影响
- 继承方式对于访问权限的影响
- 数据库使用NULL对于效率有什么影响
- @RequestMapping对于url的影响
- 字体大小对于offsetHeight 的影响
- MySQL数据库中对于网卡绑定对授权和访问的影响测试一例
- 约束对效率的影响
- 影响算法效率的因素
- 影响项目的执行效率
- 影响vector效率的关键
- 结构对齐对结构成员的访问效率影响的测试。
- RAC的cache fusion对数据块访问效率的影响
- 图的BFS遍历中标记已访问的节点操作影响效率
- 对于学习效率的感想
- 对于效率的一点感慨
- 中外文化差异对于易用性的影响
- 对一个文件中的指定信息进行过滤输出结果
- Nodejs 部署到阿里云全过程
- [C#]Array.Sort()排序的原理
- bzoj2179(fft模板)
- 终于开通自己的博客了
- final对于访问效率的影响
- 【Java SE】面向对象高级特性
- 卷积新用之语言模型
- POJ 3882 Stammering Aliens 已被翻译
- Qt设计时钟
- 关于csdn的makdown使用方法
- 洛谷 P1058 立体图
- systemverilog语法(十)
- 舵机的原理和控制