Java 性能优化之直接使用成员变量 VS 拷贝副本

背景

刷到一个大佬的 CSDN 博客,仔细看了一下性能优化专栏。联想到我们的日常开发工作,由于业务比较简单,很容就忽略性能问题。但是,性能优化的一下常见思路,也早有耳闻。看了一个 Java 性能优化的方法 「减少操作指令」,印象挺深的,测试一下。

编写一个测试类

java 复制代码
public class JcpFieldTest {
    private List<String> data = new ArrayList<>();

    public void doOne(String param) {
        if (data != null && data.size() > 0 && data.contains(param)) {
            System.out.println(data.indexOf(param));
        }
    }


    public void doTwo(String param) {
        List<String> data = this.data;
        if (data != null && data.size() > 0 && data.contains(param)) {
            System.out.println(data.indexOf(param));
        }
    }

    public static void main(String[] args) {
        new JcpFieldTest().doOne("zhang");
        new JcpFieldTest().doTwo("zhang");
    }
}

一个 Java 类包含了一个成员变量,在操作方法中,需要使用这个成员变量进行大量的计算,测试代码中给出了两种方式:

  1. 直接引用成员变量
  2. 定义一个局部变量指向这个成员变量,后面的操作使用局部变量

查看字节码

上面的两种方法有什么区别呢?IDEA 中编译代码后,进入 target 目录下反编译类:javap -c JcpFieldTest ,两种方法的字节码命令条数是不一样的。

直接引用成员变量 ,字节码信息: aload_0 是加载 this 对象,getfield 是获取成员变量的值,总指令条数 48 条,每次使用成员变量都会执行这两个操作。

堆栈拷贝引用成员变量 ,字节码信息: 首次拷贝时执行这两个操作,后面直接操作堆栈变量,指令总数少了 7 条。

启示录

日常开发中都用的是第一种,直接引用成员变量的,之所以抽取成员变量,一方面就是方便各个方法处理时使用数据的。

按本文的测试结果,如果某个成员变量在某个方法中频繁被使用,超过3次以上的话,开始定义一个堆栈变量性能会高一点。

SpringBoot 内嵌 Tomcat 的源码中就有类似的代码:

在函数中声明一个和成员变量同名的局部变量,然后将成员变量赋值给局部变量,再去使用,这就是一个优化思想。

相关推荐
好好沉淀27 分钟前
@NotBlank(message = “{xxx}“) 注解中花括号的含义
java
fīɡЙtīиɡ ℡33 分钟前
内存泄漏产生的原因
java·spring·servlet
码智社2 小时前
Java实现RSA密钥生成、加密解密、加签验签
java
wear工程师2 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh2 小时前
栈和队列~
java·开发语言
审小匠OpenCPAi2 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
码上上班2 小时前
docker课程
java·docker·容器
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
达子6663 小时前
第9章_HarmonyOs图解 用Java开发UI
java·ui·harmonyos
龙虾PRO5 小时前
能源与股票量化核心差异,AI全链路落地实操手册
java·面试·职场和发展