宁波有没有开发网站的公司,乐陵森林大队长李兵,python可以自学吗,互联网公司可通过数据分析人们的哪些方面背景
刷到一个大佬的 CSDN 博客#xff0c;仔细看了一下性能优化专栏。联想到我们的日常开发工作#xff0c;由于业务比较简单#xff0c;很容就忽略性能问题。但是#xff0c;性能优化的一下常见思路#xff0c;也早有耳闻。看了一个 Java 性能优化的方法 「减少操作指令…背景
刷到一个大佬的 CSDN 博客仔细看了一下性能优化专栏。联想到我们的日常开发工作由于业务比较简单很容就忽略性能问题。但是性能优化的一下常见思路也早有耳闻。看了一个 Java 性能优化的方法 「减少操作指令」印象挺深的测试一下。
编写一个测试类
public class JcpFieldTest {private ListString 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) {ListString 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 类包含了一个成员变量在操作方法中需要使用这个成员变量进行大量的计算测试代码中给出了两种方式
直接引用成员变量定义一个局部变量指向这个成员变量后面的操作使用局部变量
查看字节码
上面的两种方法有什么区别呢IDEA 中编译代码后进入 target 目录下反编译类javap -c JcpFieldTest 两种方法的字节码命令条数是不一样的。
直接引用成员变量字节码信息 aload_0 是加载 this 对象getfield 是获取成员变量的值总指令条数 48 条每次使用成员变量都会执行这两个操作。
堆栈拷贝引用成员变量字节码信息 首次拷贝时执行这两个操作后面直接操作堆栈变量指令总数少了 7 条。
启示录
日常开发中都用的是第一种直接引用成员变量的之所以抽取成员变量一方面就是方便各个方法处理时使用数据的。
按本文的测试结果如果某个成员变量在某个方法中频繁被使用超过3次以上的话开始定义一个堆栈变量性能会高一点。
SpringBoot 内嵌 Tomcat 的源码中就有类似的代码
在函数中声明一个和成员变量同名的局部变量然后将成员变量赋值给局部变量再去使用这是优化 Java 程序性能的常见做法看似多定义一次局部变量实际上减少了不必要的底层指令。
一次成员变量的引用就会多出两个加载指令如果一个业务流程中涉及多个类的方法的调用积小成多指令数量就很客观了。所以参考 SpringBoot 的做法引用类的成员变量之前先定义一个堆栈变量指改成员。