性能微优化-switch
6.11 switch 使用
在条件判断里,如果有较多分支的判断,switch通常比if的效率更高。if语句会每次取出变量进行比较从确定处理分支,而switch语句会编译后生成字节码指令TABLESWITCH或者LOOKUPSWITCH。如下代码
public void testSwitch(){
int c;
switch(a){
case 1:c=a;break;
case 2:c=a;break;
case 3:c=a;break;
case 5:c=a;break;
case 9:c=a;break;
}编译字节码如下:
public testSwitch()V
ALOAD 0
GETFIELD com/ibeetl/jmh/ch05/SwitchTest.a : I
TABLESWITCH
1: L0
2: L1
3: L2
4: L3
5: L4
6: L3
7: L3
8: L3
9: L5
default: L3
L0
....
L3
FRAME SAME
RETURN可以安装Idea插件
ASM Bytecode Viewer查看Java代码对应的字节码
switch代码被编译成TABLESWITCH指令,包含了1到9个分支,与我们实际Java代码的5个分支不同,这是一个性能提升点,因为TABLESWITCH指令 是按照类似数组一样方式索引。假设a值为1,则调到指令L0处,如果a为2,则调到L1处,如果a是3,则跳到L2处,如果a是4,则调到L3处,L3也是default分支的指令位置。
如果变量范围过大,比如增加case 999, 则如上代码将被编译成LOOKUPSWITCH,虚拟机将排序并使用二分查找匹配项
因此,switch 被编译成TABLESWITCH,理论上有着最快的速度。我们在编写siwtch代码时候,也最好提供连续的选项值以获得最佳性能
