为了账号安全,请及时绑定邮箱和手机立即绑定

局部变量的范围如何影响 Java 上的加载/存储性能?

局部变量的范围如何影响 Java 上的加载/存储性能?

慕哥6287543 2021-08-13 16:38:17
环境: 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";}谁能告诉我这两个例子的区别,哪个代码效率更高
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

在第一个示例中,msg在显示的最外层作用域中处于作用域内,而msg在第二个示例中仅在循环体中处于作用域内。在我继续之前,我会提醒读者,过早的优化,尤其是这里看到的微优化,通常并不合适或有用,首先应该争取清晰、可读和可维护的代码。


我现在将继续为好奇的读者。通过使用javac 1.8.0_171编译代码并使用 反汇编javap -c,我得到以下字节码:


第一种方法:


    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

如您所见,两个编译结果在本质上非常相似。两者都具有循环结构,循环体由负载常量 (ldc) 和astore_<n>一个局部变量槽组成。变量对槽的分配是不同的(第一个分配i给槽 2 和msg1,第二个则相反)但这应该不会产生显着影响。第一个确实包括两个额外的字节码,null以便msg在第一次迭代之前存储。然而,这种影响是如此微小,以至于尝试优化它是没有意义的。


我目前没有工具集来查看 JIT 优化产生的机器代码,但我强烈怀疑整个循环会被任何有能力的 JIT 编译器优化掉。


查看完整回答
反对 回复 2021-08-13
  • 1 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号