2011-01-21 34 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,可以降低性能。