final修饰可以在一定程度上提升代码的执行性能,为什么呢?

final修饰可以在一定程度上提升代码的执行性能,为什么呢?

问题描述:

在3-3的课中,老师说到“通过final修饰可以在一定程度上提升代码的执行性能,但是也相应的降低了代码的灵活性。” 问题比较多,见谅。

请问final是如何提升代码执行性能的?

final修饰类能提升性能吗?为什么?有什么例子呢?

final修饰方法能提升性能吗?为什么?有什么例子呢?

final修饰成员变量能提升性能吗?为什么?有什么例子呢?

final修饰方法内局部变量能提升性能吗?为什么?有什么例子呢?


尝试过的解决方式:


我查找了一些网络说法,但不知道是否正确,也没有办法去很好的验证。

1.知乎上的回答https://zhuanlan.zhihu.com/p/63816871

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。 此举能够使性能平均提高50% 。

(能有50%这么多?)


我的这里理解是,final对类和方法修饰,能提升运行效率。但不知道这些话的可信度。这里的解释正确吗?


2. CSDN https://blog.csdn.net/eclipser1987/article/details/7336558

文章说明如下:(也不知道可不可信)

于是我找到这种提升性能的2种解释:


其一:

final方法:

当一个方法用“final”来修饰时,表示该方法不可以被子类重写。


使用final方法的原因有二:   


一、限制了子类中对其改写;

二、提高了执行的效率,因为这种情况属于静态绑定,Java虚拟机(JVM)的即时编译器就不会去检索该方法在其父类、子类或爷爷类、孙子类等有内联关系的类中是否存在重写,省去了动态判断究竟要执行哪一个类(具体内联关系的类)的这个名称的方法。


 其二:

final方法   如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。   


使用final方法的原因有二:   


第一、把方法锁定,防止任何继承类修改它的意义和实现。   


第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。


3. stackoverflow https://stackoverflow.com/questions/4279420/does-use-of-final-keyword-in-java-improve-the-performance

这里面有几个说final修饰成员变量是能提供效率的,比如string concatenation的时候会更快,还有就是在涉及到conditional compilation的时候,但是评论里面说这个测试并不能代表正常使用时final对性能的提升。多数人都说final对性能的提升没有太大意义,final主要是在design和readability上有用。 也有评论引述了IBM的说法,说final修饰classes 和method对性能没有提升,但是final修饰fields是有性能提升的。 我看的迷糊了,也不知道到底是什么结论。


题外话:他们能显示java的produces 这个是怎么做的?我搜索了bipush这些代码,发现是编译的bytecode,如何像这样看到java执行bytecode的顺序呢?

https://img1.sycdn.imooc.com//climg/62940c6309c4dc2806810817.jpg

下载视频          

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,1、带有 final 修饰符的类是不可派生的。在 Java 核心 API 中,有许多应用 final 的例子,例如: java.lang.String,整个类都是 final 的。为类指定 final 修饰符可以让类不可以被继承,为方法指定 final 修饰符可以让方法不可以被重写。如果指定了一个类为 final,则该类所有的方法都是 final 的。Java 编译器会寻找机会内联所有的 final 方法,通过内联提升 Java 运行效率。

2、这边老师也不清楚具体是怎么执行的。

祝学习愉快!

  • 只能卷了 提问者 #1
    你好,请问内联是什么?为什么内联提升效率呢?
    下载视频          
    2022-05-30 12:40:17
  • 好帮手慕小尤 回复 提问者 只能卷了 #2

    同学你好,内联就是把调用方函数代码"复制"到调用方函数中,减少因函数调用开销的技术。方法调用需要有一定的时间开销和空间开销,当一个方法体不大,但又频繁被调用时,这个时间和空间开销会相对变得很大,变得非常不划算,同时降低了程序的性能。

    祝学习愉快!

    2022-05-30 13:56:46
  • 只能卷了 提问者 回复 好帮手慕小尤 #3

    感谢回答。就是如果频繁调用一个方法,jvm自动识别热点函数,达到阈值触发JIT优化,把热点函数编译为机器码放进codecache。如果其他方法调用这个热点函数,就不再调用这个函数的方法,而是直接使用保存的机器码。省去方法栈帧的生成、局部变量的进栈与出栈、指令执行地址的跳转的底层操作,节省了内存开销和时间开销。这样理解没错吧?

    2022-06-06 00:23:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师