JDK代碼中的優化 之 「avoid getfield opcode」

 

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

相關文章
相關標籤/搜索