2011-01-21 69 views
28

在Java中的String类的修剪方法包含此:避免getfield命令的操作码

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

我有点被评论不解 “避免getfield命令代码” ...

什么意思是不是? (我把它这样就避免了在字节码使用getfield命令的,但为什么这是一件好事[TM]?)

它是防止创建对象的情况下,修剪没有做任何事情(因此这个被返回)还是?

回答

20

猜测是该点的值复制到本地变量一次,以避免从堆中多次取字段值在接下来的几行循环的每个迭代。

当然,这引发了一个问题,为什么相同的评论还没有应用在“len”局部变量上。 (我也希望JIT避免重写,尤其是因为变量是最终的。)

+7

该注释不适用于'len',因为len在该方法中被主动修改,所以它必须是本地变量。另一方面,'off'和'val'没有被修改,但仅仅为优化而存在。 – Lars 2011-01-21 17:27:39

+0

@Lars:斑点;我没有看到len的变化。 – 2011-01-21 17:30:27

11

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

你可以从剩余的代码中看到:

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

所以,当你在一个循环的时候,它必须执行getfield每次引用valueoffset时间。如果循环运行很长时间(如果循环条件经过测试,执行offsetvalue),则可能会导致性能下降。所以通过使用局部变量offval,可以降低性能。