避免获取字段操作码

2022-09-01 12:03:22

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

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

我对“避免获取字段操作码”的评论有点困惑......

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

是为了防止在修剪不执行任何操作的情况下创建对象(因此返回还是?


答案 1

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

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


答案 2

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

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

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

因此,当您处于循环中时,每次引用或 .如果循环运行很长时间,则可能会产生较大的性能影响(因为每次测试循环条件时,都会对 和 执行 a。因此,通过使用局部变量 和 ,可以减少性能影响。getfieldvalueoffsetgetfieldoffsetvalueoffval


推荐