避免 getfield 操作码

发布于 2024-10-13 10:22:52 字数 366 浏览 1 评论 0原文

在Java的String类中,trim方法包含这样的内容:

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

我对注释“avoid getfield opcode”有点困惑......

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

它是为了防止在trim不创建对象的情况下创建对象吗?不做任何事情(因此返回this)或者?

In Java's String class, the trim method contains this:

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

I'm a bit puzzled by the comment "avoid getfield opcode"...

What does this mean? (I take it this avoids the use of getfield in the bytecode but why is this a Good Thing [TM]?)

Is it to prevent object creation in case trim doesn't do anything (and hence this is returned) or?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野心澎湃 2024-10-20 10:22:52

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

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

My guess is that the point is to copy the values into local variables once, to avoid having to fetch the field value repeatedly from the heap for each iteration of the loop in the next few lines.

Of course, that begs the question as to why the same comment hasn't been applied on the "len" local variable. (I'd also expect the JIT to avoid refetching anyway, especially as the variables are final.)

怀里藏娇 2024-10-20 10:22:52

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

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

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

因此,当您处于循环中时,每次引用 valueoffset 时,它都必须执行 getfield >。如果循环运行很长时间,您可能会遭受很大的性能损失(因为每次测试循环条件时,都会针对 offset 和 <代码>值)。因此,通过使用局部变量 offval 可以减少性能损失。

getfield is used to get the member variable of a class.

As you can see from the remaining code:

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

So when you're in a loop, it has to execute getfield every time you reference value or offset. You can incur a large performance-hit if the loop runs for a long time (because every time the loop-condition is tested, a getfield is exeuted for both offset and value). So by using the local variables off and val, you reduce the performance hit.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文