第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

局部變量的范圍如何影響 Java 上的加載/存儲(chǔ)性能?

局部變量的范圍如何影響 Java 上的加載/存儲(chǔ)性能?

慕哥6287543 2021-08-13 16:38:17
環(huán)境: JDK1.8 Windows 10示例1:String msg=null;for (int i=0;i<10;i++){     msg="Hello"; }和示例2:for(int =0;i<10;i++){      String msg = "hello";}誰(shuí)能告訴我這兩個(gè)例子的區(qū)別,哪個(gè)代碼效率更高
查看完整描述

1 回答

?
阿晨1998

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)化掉。


查看完整回答
反對(duì) 回復(fù) 2021-08-13
  • 1 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)