zoukankan      html  css  js  c++  java
  • JDK代码中的优化 之 “avoid getfield opcode”

    在查看String类源码时,常看到注释 /* avoid getfield opcode */

    如 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,  功能为 获取指定类的实例域,并将其值压入栈顶

    下面通过两段代码的字节码文件来比较一下:

    代码1,

     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:

     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操作。

    总结:在一个方法中需要大量引用实例域变量的时候,使用方法中的局部变量代替引用可以减少getfield操作的次数,提高性能

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/captains/p/5910089.html
Copyright © 2011-2022 走看看