在查看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操做的次數,提升性能源碼