1 回答

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
在第一個(gè)示例中,msg在顯示的最外層作用域中處于作用域內(nèi),而msg在第二個(gè)示例中僅在循環(huán)體中處于作用域內(nèi)。在我繼續(xù)之前,我會(huì)提醒讀者,過(guò)早的優(yōu)化,尤其是這里看到的微優(yōu)化,通常并不合適或有用,首先應(yīng)該爭(zhēng)取清晰、可讀和可維護(hù)的代碼。
我現(xiàn)在將繼續(xù)為好奇的讀者。通過(guò)使用javac 1.8.0_171編譯代碼并使用 反匯編javap -c,我得到以下字節(jié)碼:
第一種方法:
Code:
0: aconst_null
1: astore_1
2: iconst_0
3: istore_2
4: iload_2
5: bipush 10
7: if_icmpge 19
10: ldc #2 // String f
12: astore_1
13: iinc 2, 1
16: goto 4
19: return
第二種方法:
Code:
0: iconst_0
1: istore_1
2: iload_1
3: bipush 10
5: if_icmpge 17
8: ldc #2 // String f
10: astore_2
11: iinc 1, 1
14: goto 2
17: return
如您所見(jiàn),兩個(gè)編譯結(jié)果在本質(zhì)上非常相似。兩者都具有循環(huán)結(jié)構(gòu),循環(huán)體由負(fù)載常量 (ldc) 和astore_<n>一個(gè)局部變量槽組成。變量對(duì)槽的分配是不同的(第一個(gè)分配i給槽 2 和msg1,第二個(gè)則相反)但這應(yīng)該不會(huì)產(chǎn)生顯著影響。第一個(gè)確實(shí)包括兩個(gè)額外的字節(jié)碼,null以便msg在第一次迭代之前存儲(chǔ)。然而,這種影響是如此微小,以至于嘗試優(yōu)化它是沒(méi)有意義的。
我目前沒(méi)有工具集來(lái)查看 JIT 優(yōu)化產(chǎn)生的機(jī)器代碼,但我強(qiáng)烈懷疑整個(gè)循環(huán)會(huì)被任何有能力的 JIT 編譯器優(yōu)化掉。
添加回答
舉報(bào)