在Java的String类中, trim 方法包含:
int off = offset; /* avoid getfield opcode */
char[] val = value; /* avoid getfield opcode */
我对评论“避免使用getfield操作码”感到有点困惑 ......
这是什么意思? (我认为这样可以避免在字节码中使用 getfield ,但为什么这是一个好东西?)
是否在 trim 没有做任何事情的情况下阻止对象创建(因此返回)或?
答案 0 :(得分:22)
我的 guess 的关键是要将值复制到局部变量一次,以避免在接下来的几行中为循环的每次迭代重复从堆中获取字段值。
当然,这引出了一个问题,即为什么相同的评论没有应用于“len”局部变量。 (我还希望JIT无论如何都要避免重新获取,特别是因为变量是最终的。)
答案 1 :(得分:13)
getfield
用于获取类的成员变量。
从剩下的代码中可以看出:
while ((st < len) && (val[off + st] <= ' ')) {
st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
len--;
}
因此,当您处于循环中时,每次引用getfield
或value
时都必须执行offset
。如果循环运行很长时间,您可能会遇到大的性能损失(因为每次测试循环条件时,getfield
和offset
都会value
。因此,通过使用局部变量off
和val
,可以降低性能损失。