Skip to content

性能微优化-switch

About 392 wordsAbout 1 min

性能新书

2026-08-20

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代码时候,也最好提供连续的选项值以获得最佳性能

知行合一