下面3句是冲别人的帖子上看到的。其中“转入内嵌机制”是什么意思?怎样提高了执行效率
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。 附那帖子链接 http://topic.csdn.net/u/20081028/17/f2993356-f89b-4dde-a94f-9ec5821c5ac3.html?49508
使用final方法的原因有二:
第一、把方法锁定,防止任何继承类修改它的意义和实现。
第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。 附那帖子链接 http://topic.csdn.net/u/20081028/17/f2993356-f89b-4dde-a94f-9ec5821c5ac3.html?49508
不过final还有一大用处就是解决了c++中多继承中父类成员变量重名的麻烦
return (a>b?a:b);
}
我们可以在main方法中调用这个方法来获得最大值...
public static void main(String[] args){
Test test=new Test();
int result=test.maxNumber(3,5);
System.out.println(result); //输出8
}或者,对于这样的简单逻辑,我们根本就不需要写一个方法,直接写逻辑:...
public static void main(String[] args){
int result=3>5?3:5;
System.out.println(3>5?3:5);
}
你可以自己测试下,加上100000次的循环来计算时间间隔,可以比较出,直接写代码在逻辑中比调用方法maxNumber效率高。所以,当你将一个方法声明为final后,就相当于直接在调用处展开这个方法的代码一样。 速度就会快,效率也高。实际就是说,当将一个方法声明为final后,当你编译应用程序时就可以确定房方法的代码,并且编译其可以将该方法的代码展开插入到调用者代码处,提高了应用的运行速度和系统效率。这也就是它提到了“内嵌机制”,展开final声明的方法的代码,嵌入到调用处。final声明的方法,有点类似c++中的内联函数,避免被调用产生的开销提高执行效率,且能被编译器优化处理。
意思是调用方法的时候直接将方法的主体插入到调用处,而不用去访问类或者对象,这样做会提高50%左右的效率。
但是,如果方法的主体比较庞大的时候,并且多处被调用将导致主题代码迅速膨胀,同样也产生效率问题,总之,final修饰方法要慎用。
第一、把方法锁定,防止任何继承类修改它的意义和实现。
这是java编译器负责限定的语义,当你打算在子类中重定义final方法时,编译报错。第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
这是java虚拟机可能提供的语义。虚拟机中的编译器会考虑将final方法展开,避免调用开销只是很小的一部分收益,更重要的是可以在更大的范围内进行优化,此外,jit会进行很多的内联,并不限于final存在的情形。即使方法不是final的,编译器如果能够确定,在当前已经加载的类中,并不存在对方法的重写,也可以进行inline处理。当然,这种假设不成立的时候,可以恢复。
final 用在变量上,主要是防止变量的值被更改。至于效率方面的作用不是太明显
说说原理吧。
所谓内联函数,就是说这个函数/方法在编译的时候会被联编到调用它的函数/方法里面。
比如说,f是一个内敛函数,method1,method2...调用了f。那么,f就被编译到method1和method2内部。再来说说为何会提高效率。大家都知道,函数/方法调用过程中CPU要进行现场处理(不妨看做是一种中断),当前的变量状态、寄存器状态、程序计数器PC都要一一入栈保护起来,调用返回时又要一一出栈恢复以继续执行。相对于顺序执行流程,函数调用的入栈出栈带来了额外的开销,效率没有顺序执行高。
而内联函数基本上可以等价于把函数体直接“复制”到调用函数中。就不存在调用了。这样执行效率就提高了。
说明:1)由于内敛函数不单独占用内存空间,编译出来的应用程序比普通应用程序大。调用越多也就越大
2)一般函数体较小而使用频繁、功能相对简单的方法/函数可以使用内联--也就是final
3)目前硬件性能越来越高,这点性能差异已经不重要了。重要的是在多线程、多任务处理中,内敛函数方法处理起来要更简单、安全(原因就不说了吧。)