避免使用getfield操作码

时间:2011-01-21 17:12:47

标签: java bytecode opcode

在Java的String类中, trim 方法包含:

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

我对评论“避免使用getfield操作码”感到有点困惑 ......

这是什么意思? (我认为这样可以避免在字节码中使用 getfield ,但为什么这是一个好东西?)

是否在 trim 没有做任何事情的情况下阻止对象创建(因此返回)或?

2 个答案:

答案 0 :(得分:22)

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

当然,这引出了一个问题,即为什么相同的评论没有应用于“len”局部变量。 (我还希望JIT无论如何都要避免重新获取,特别是因为变量是最终的。)

答案 1 :(得分:13)

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

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

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

因此,当您处于循环中时,每次引用getfieldvalue时都必须执行offset。如果循环运行很长时间,您可能会遇到大的性能损失(因为每次测试循环条件时,getfieldoffset都会value。因此,通过使用局部变量offval,可以降低性能损失。