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操作的次数,提高性能

  • 相关阅读:
    PHP 实现无限极栏目分类
    CI 中css样式或者js样式加载不进来的情况
    php 写model层
    Struts1 中$ 没有解析的问题
    App设计相关网站
    如何知道 win10 的激活到期时间和期限等
    dev XtraMessageBox按钮显示中文
    静电的ui教程
    从零开始做UI-静电的sketch设计教室 视频教程
    SQL Server2005作业执行失败的解决办法
  • 原文地址:https://www.cnblogs.com/captains/p/5910089.html
Copyright © 2011-2022 走看看