在查看String类源码时,常看到注释 /* avoid getfield opcode */jvm
如 trim()方法性能
1 public String trim() { 2 int len = value.length; 3 int st = 0; 4 char[] val = value; /* avoid getfield opcode */ 5 6 while ((st < len) && (val[st] <= ' ')) { 7 st++; 8 } 9 while ((st < len) && (val[len - 1] <= ' ')) { 10 len--; 11 } 12 return ((st > 0) || (len < value.length)) ? substring(st, len) : this; 13 }
经查 getfield 为jvm 指令助记符, 指令码为0XB4, 功能为 获取指定类的实例域,并将其值压入栈顶this
下面经过两段代码的字节码文件来比较一下:spa
代码1,code
1 public class Test { 2 char[] arr = new char[100]; 3 public void test() { 4 System.out.println(arr[0]); 5 System.out.println(arr[1]); 6 System.out.println(arr[2]); 7 } 8 public static void main(MyString[] args) { 9 Test t = new Test(); 10 t.test(); 11 } 12 } 13 14 15
代码2:blog
1 public class Test2 { 2 char[] arr = new char[100]; 3 public void test() { 4 char[] v1 = arr; 5 System.out.println(v1[0]); 6 System.out.println(v1[1]); 7 System.out.println(v1[2]); 8 } 9 public static void main(MyString[] args) { 10 Test t = new Test(); 11 t.test(); 12 } 13 } 14 15 16
注意到两个字节码文件中的getfield操做的次数,代码2只出现一次,即将arr 赋值给 v1, 而代码2中则在每次print时,均执行getfield操做。get
总结:在一个方法中须要大量引用实例域变量的时候,使用方法中的局部变量代替引用能够减小getfield操做的次数,提升性能源码