1 回答

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 编译器优化掉。
添加回答
举报