the art of java 源代码_请不要再说Java中final方法比非final性能更好了
无继承
- 有 static 修饰
static final
static 非 final
结果
这里使用了 OpenJDK 的 JMH 基准测试工具来测试的,结果如下:
总结:你说final的性能比非final有没有提升呢?可以说有,但几乎可以忽略不计。如果单纯地追求性能,而将所有的方法修改为 final 的话,我认为这样子是不可取的。
而且这性能的差别,远远也没有网上有些人说的提升 50% 这么恐怖(有可能他们使用的是10年前的JVM来测试的吧^_^,比如 《35+ 个 Java 代码性能优化总结》这篇文章。雷总:不服?咱们来跑个分!)
分析
字节码级别的差别
StringKit.java StringKitFinal.java
它们在字节码上的差别:
可以看到除了方法名和方法修饰符不同之外,其他的没有什么区别了。
在调用者上面的字节码差别:
可以看到,它们在调用者上面的字节码也没有什么区别,只是方法名不一样之外。
对于 JVM 来说,它是只认字节码的,既然字节码除了方法名和修饰符一样,其他都一样,那就可以大概推测它们的性能几乎可以忽略不计了。因为调用 static final 和 static 非 final 的JVM指令是一样。
- 无 static 修饰
方法体是一样的,只是将它们删除了 static 的修饰。
结果
分析
字节码级别的差别
可以看到,字节码上除了名字和 final 修饰符差别外,其余的是一样的。
在调用者上面的字节码差别
可以看到,它们除了名字不同之外,其他的JVM指令都是一样的。
总结
对于是否有 final 修饰的方法,对性能的影响可以忽略不计。因为它们生成的字节码除了 flags 标志位是否有 final 修饰不同之外,其他所有的JVM指令,都是一样的(对于方法本身,以及调用者本身的字节码都一样)。对于JVM来说,它执行的就是字节码,如果字节码都一样的话,那对于JVM来说,它就是同一样东西的了。
有继承
无 final 修饰
有 final 修饰
测试代码
写一个类来继承上面的抽象类,以此来测试在继承中 final 有否对多态中的影响
然后在基准测试中:
测试结果
- 非 final 结果
- 有 final 结果
- 总对比
它们字节码的区别
可以看到,除了它们的方法签名和方法名字不同之外其他的都是一样的,包括JVM调用指令也完全是一样的。
结论
可以看到它们几乎是一样的。
总结
基于上面的基准测试结论,我认为滥用或刻意为了所谓的提升性能,而去为每一个方法尽可能添加 final 的关键字是不可取的。使用 final ,更多的应该是根据Java对 final 的语义来定义,而不是只想着为了提升性能(而且这影响可以忽略不计)而刻意用 final.
使用 final 的情况:
final 变量: 表示只读(只初始化一次,但可多次读取) final 方法:表示子类不可以重写。(网上认为 final 比非 final 快,就是认为它是在编译的时候已经静态绑定了,不需要在运行时再动态绑定。这个可能以前的JVM上是正确的,但在现代的JVM上,这个可以认为没什么影响,至少我在基准测试里是这样子) final 类: 它们不能被继承,而且final类的方法,默认也是 final 的。
关于这个 final 的性能问题,我也Google了下,发现 stackoverflow 上,也有类似的问题:
参考资料
https://www.javazhiyin.com/go?url=https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance
作者:emacsist
来源:java知音
the art of java 源代码_请不要再说Java中final方法比非final性能更好了相关推荐
- 解析java源代码_一步步解析java执行内幕
对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式.在本篇文章中,将重点研究java源代码的执行原理,即从程 序员编写JAVA源代码,到最终形成产品,在整个过 ...
- 兰顿蚂蚁 java源代码_兰顿蚂蚁-Java
兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只"蚂蚁". 蚂蚁的头部朝向为:上下左右其中一方 ...
- 斐波那契java编写_请编写一个Java程序的斐波那契数
展开全部 class Fibonacci{ private int[] f; private int length; public Fibonacci(int length){ if(length&l ...
- java火山_火山代码转java源代码查看
今天我们来研究一下火山安卓的源代码,火山安卓允许我们以本地化编程(中文代码编程)的方式来撰写安卓app,那么在生成实际要安装到安卓app的时候,它是如何进行编译处理的呢.让我们今天来一起探究一下. 首 ...
- 排序算法java源代码_排序算法汇总(java实现,附源代码)
整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...
- java 新建菜单选项_请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxM..._考试资料网...
请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxMenultem(复选框),一条分割线和一个Exit项.要求打开或关闭复选框时,确定是哪个被切换,是开还是关,并输出它的状态: ...
- java简述常见的布局极其特点_请简要说明 Android 中五种常见布局的特点。_学小易找答案...
[简答题]请简要说明有序广播和无序广播的区别 [简答题]请简要说明 Android 程序结构中 AndroidManifest.xml 的功能? [简答题]简述李村站人工办理进路的作业过程. [简答题 ...
- 心java源代码_写了一个心形图案的java源代码,想发给朋友,朋友怎样才能像打开文档一样方便查看呢?...
搞清楚java的运行机制你就明白了该怎么办 java源代码->java编译器生成字节码文件->java虚拟机执行字节码文件->心形图案显示 因此你要让朋友直接运行,你就要让上述过程自 ...
- java输出GPA_请完成下列Java程序:实现换算GPA,对于学生学习的每一门课程,都输入两个..._考试资料网...
问答题请完成下列Java程序:实现换算GPA,对于学生学习的每一门课程,都输入两个数据:考试成绩和学分,考试成绩按如下公式换算: 90-100:5 75-89: 4 60-74: 3 40-59: 2 ...
最新文章
- Springboot swagger2教程
- jquery 插件 任意位置浮动固定层
- network 学习笔记
- redhat6.5 yum register 问题
- JBoss5 启动报错java.lang.IllegalArgumentException: ...
- 全国计算机等级考试题库二级C操作题100套(第78套)
- You have unstaged changes.
- ubuntu16.04编译boost for Android(boost 1.65)
- 关于dev无法更新、调试的问题
- 说一说阿里云弹性公网IP那些事
- 数据库学习--wildfly配置postgreSQL数据源
- LeetCode Interleaving String
- 【反编译】apk反编译之修改贴吧发贴回帖时显示的地理位置
- 小甲鱼 C语言 19课 字符串的处理函数
- 大气层整合傻瓜包_【工具】switch大气层9.2系统升级固件+大气层0.10.3离线整合包...
- 腾讯和360之争之二
- 五一南京-无丝竹无案牍
- iOS自己总结的超级详细分解富文本大全(AttributedString),图文混排很轻松
- vue(移动端)使用高德地图实现精准定位
- java架构师培训班,太完整了!
热门文章
- 删除Kali Linux多余的系统架构
- dr.web for android version 9,DrWeb安全防护
- W ndoWs7更新怎么关闭,怎么样取消windows7自动更新
- springboot导入项目依赖报错_使用Spring Boot很简单,go!!!
- 最新研究 | 人类大脑皮质对有声调和非有声调语言的音高编码
- 蟑螂背上芯片板子,组队去救人类
- Nature子刊:用机器学习揭露人类基因调控背后的“语法”
- 苹果M1芯片升级果然很炸场:性能暴涨功耗速降!但最香新品竟是无降噪AirPods 3...
- 全球最大AI巨量模型,参数2457亿炼丹16天专注中文,打造者绝对让你意外
- Deepfake这次不换脸了,直接换了座城市