• JIT内联优化


    最近改sonar问题,会对方法行数有限制,加上之前团队要求的尽量拆小方法等,回顾下内联优化。

    内联函数

    内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。

    public newOrder(String company){
        String orderSn = this.genOrderSn(company);
        //...
    }
    
    private String genOrderSn(String company){
        return SnUtil.newSn(company);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    内联后

    public newOrder(String company){
        String orderSn = SnUtil.newSn(company);
        //...
    }
    
    • 1
    • 2
    • 3
    • 4

    好像跟IDEA直接ctrl + shift + n 一样,不过这个jit编译器在编译期才把这个在一起展开。

    什么时候内联

    Java不支持直接声明为内联函数的,如果想让他内联,只能够向编译器提出请求,最后是不是内联函数,是由编译器说了算。方法内联是由JIT编译器在运行时完成的,取决于一下几点:

    1:是否热点方法:当一个方法被调用超过一定次数,编译器会认为这是一个热点方法,从而进行内联优化。
    2:方法大小:过大的方法被Jit认为是不适合做内联的,这个数值由-XX:FreqInlineSize,默认是325b,大于这个大小的方法不考虑内联。
    3:唯一性:如果这个方法由多个实现,JIt无法确认具体调用的是哪一个方法,无法完成内联。例如protect,public方法被子类重载。

    和其他比较

    1. c++: 想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。
    2. kotlin: 也是可以通过加关键字 inline实现。

    小结

    1. private,static,final方法因为唯一性更有可能被编译器内联。
    2. 小方法更有可能被内联。
      通过对编译器内联的学习,可以知道在平时写代码过程中,把一个大方法按含义拆成多个private小方法,不会增加压栈出栈的负担,反而可以提升代码可读性,更好的利用jvm的内联优化。
  • 相关阅读:
    Git 学习笔记 | Git 分支
    库中是如何实现string类的?
    从一到无穷大 #17 Db2 Event Store,A Purpose-Built IoT Database Engine
    超宽带脉冲定位方案,UWB精准定位技术,无线室内定位应用
    简述SVM
    IEEE754浮点型+JS精度问题
    企业数据治理的下一步是数据资产管理?
    【更新】囚生CYの备忘录(20221121-)
    opencv的使用(Ubuntu linux环境,AS jni,AS java)
    安徽京准-NTP网络授时服务器助力助力甘南州公共资源交易
  • 原文地址:https://blog.csdn.net/vipshop_fin_dev/article/details/132798312