最近改sonar问题,会对方法行数有限制,加上之前团队要求的尽量拆小方法等,回顾下内联优化。
内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。
原
public newOrder(String company){
String orderSn = this.genOrderSn(company);
//...
}
private String genOrderSn(String company){
return SnUtil.newSn(company);
}
内联后
public newOrder(String company){
String orderSn = SnUtil.newSn(company);
//...
}
好像跟IDEA直接ctrl + shift + n 一样,不过这个jit编译器在编译期才把这个在一起展开。
Java不支持直接声明为内联函数的,如果想让他内联,只能够向编译器提出请求,最后是不是内联函数,是由编译器说了算。方法内联是由JIT编译器在运行时完成的,取决于一下几点:
1:是否热点方法:当一个方法被调用超过一定次数,编译器会认为这是一个热点方法,从而进行内联优化。
2:方法大小:过大的方法被Jit认为是不适合做内联的,这个数值由-XX:FreqInlineSize,默认是325b,大于这个大小的方法不考虑内联。
3:唯一性:如果这个方法由多个实现,JIt无法确认具体调用的是哪一个方法,无法完成内联。例如protect,public方法被子类重载。