30

在 Java 的 String 类中,trim方法包含以下内容:

int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

我对“避免getfield操作码”的评论有点困惑......

这是什么意思?(我认为这避免了在字节码中使用getfield,但为什么这是一件好事 [TM]?)

是为了防止对象创建以防修剪不做任何事情(因此返回)还是?

4

2 回答 2

23

我的猜测是,关键是将值复制到局部变量中一次,以避免在接下来的几行中,每次循环迭代都必须从堆中重复获取字段值。

当然,这引出了一个问题,即为什么没有对“len”局部变量应用相同的注释。(我还希望 JIT 无论如何都避免重新获取,尤其是在变量是最终变量的情况下。)

于 2011-01-21T17:21:39.013 回答
14

getfield用于获取类的成员变量。

从剩下的代码中可以看出:

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}

因此,当您处于循环中时,getfield每次引用value或时都必须执行它offset。如果循环运行很长时间,您可能会招致很大的性能损失(因为每次测试循环条件时,getfield都会为offset和执行 a value)。因此,通过使用局部变量offval,您可以减少对性能的影响。

于 2011-01-21T17:27:48.823 回答