【编译器优化技术】方法内联

目录

一、概念

二、方法内联的原理

三、方法内联的条件

四、内联的隐藏条件

五、结论


方法内联,说它是编译器最重要的优化手段,甚至都可以不加 上“之一”。内联被业内戏称为优化之母,因为除了消除方法调用的成本之外,它更重要的意义是为其他优化手段建立良好的基础

一、概念

方法内联就是把调用方函数代码"复制"到调用方函数中,减少因函数调用开销的技术

函数调用过程:

1、首先会有个执行栈,存储它们的局部变量、方法名、动态连接

2、当一个方法被调用,一个新的栈帧会被加到栈顶,分配的本地变量和参数会存储在这个栈帧

3、跳转到目标方法代码执行

4、方法返回的时候,本地方法和参数被销毁,栈顶被移除

5、返回原来的地址执行

 

注:这就是通常说的函数调用的压栈和出栈过程,因此,函数调用需要有一定的时间开销和空间开销,当一个方法体不大,但又频繁被调用时,这个时间和空间开销会相对变得很大,变得非常不划算,同时降低了程序的性能。根据二八原则,80%的性能消耗其实是发生在20%的代码上,对热点代码的针对性优化可以提升整体系统的性能

 

二、方法内联的原理

就如上面所说,就是把调用方函数代码"复制"到调用方函数中

看如下例子:

private int add2(int x1 , int x2 , int x3 , int x4) {

    return add1(x1 , x2) + add1(x3,x4);

}
private int add1(int x1 , int x2) {

    return x1 + x2;

}

 

运行一段时间后,代码被内联翻译成:

private int add2(int x1 , int x2 , int x3 , int x4) {

    //return add1(x1 , x2) + add1(x3,x4);

    return x1 + x2 + x3 + x4;

}

 

三、方法内联的条件

JVM会自动的识别热点方法,并对它们使用方法内联优化。那么一段代码需要执行多少次才会触发JIT优化呢?通常这个值由-XX:CompileThreshold参数进行设置:

  •    使用client编译器时,默认为1500;
  •    使用server编译器时,默认为10000;

但是一个方法就算被JVM标注成为热点方法,JVM仍然不一定会对它做方法内联优化。其中有个比较常见的原因就是这个方法体太大了,分为两种情况。

如果方法是经常执行的,默认情况下,方法大小小于325字节的都会进行内联(可以通过** -XX:MaxFreqInlineSize=N**来设置这个大小)

 如果方法不是经常执行的,默认情况下,方法大小小于35字节才会进行内联(可以通过** -XX:MaxInlineSize=N **来设置这个大小)

我们可以通过增加这个大小,以便更多的方法可以进行内联;但是除非能够显著提升性能,否则不推荐修改这个参数。因为更大的方法体会导致代码内存占用更多,更少的热点方***被缓存,最终的效果不一定好。

JVM参数:(-XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining)

当我们执行1000次

 

 

当我们执行10001次

 

 

四、内联的隐藏条件

虽然JIT号称可以针对代码全局的运行情况而优化,但是JIT对一个方法内联之后,还是可能因为方法被继承,导致需要类型检查而没有达到性能的效果

想要对热点的方法使用上内联的优化方法,最好尽量使用final、private、static这些修饰符修饰方法,避免方法因为继承,导致需要额外的类型检查,而出现效果不好情况。

 

五、结论

1、针对热点方法,想要通过JIT内联优化来提升性能的建议 

2、更小的方法体,JVM总是偏好更小的方法。

3、尽量使用final、private、static修饰符

4、使用+PrintInlining参数校验效果(【PrintInlining】-XX:+UnlockDiagnosticVMOptions必须配合参数{2}使用,并且只能加在其后才能生效)

全部评论

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442570次浏览 4512人参与
# 春招别灰心,我们一人来一句鼓励 #
41986次浏览 533人参与
# 北方华创开奖 #
107439次浏览 599人参与
# 地方国企笔面经互助 #
7964次浏览 18人参与
# 同bg的你秋招战况如何? #
76743次浏览 563人参与
# 实习必须要去大厂吗? #
55775次浏览 961人参与
# 阿里云管培生offer #
120286次浏览 2220人参与
# 虾皮求职进展汇总 #
115687次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11584次浏览 287人参与
# 实习,投递多份简历没人回复怎么办 #
2454714次浏览 34857人参与
# 提前批简历挂麻了怎么办 #
149906次浏览 1977人参与
# 在找工作求抱抱 #
906039次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4757次浏览 55人参与
# 你投递的公司有几家约面了? #
33207次浏览 188人参与
# 投递实习岗位前的准备 #
1195950次浏览 18549人参与
# 机械人春招想让哪家公司来捞你? #
157635次浏览 2267人参与
# 双非本科求职如何逆袭 #
662248次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12734次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35815次浏览 384人参与
# 简历中的项目经历要怎么写? #
86920次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20133次浏览 240人参与
# 我的上岸简历长这样 #
452024次浏览 8088人参与
牛客网
牛客企业服务