switch为什么比if-else性能好

if-else字节码文件

在这里插入图片描述

对应的代码
在这里插入图片描述
解释:
字节码文件中L0 对应的就是int a的定义,LINENUMBER 14对应的是代码中的14行
从L1开始 L2,L4,L5,L6,L7.L8,L9,L10,L1对应的就是if-esle里面的每一个分支
L3在最下面,对应的就是System.out.println(a)
其实通过观察if-else的分支对应的字节码文件,是可以发现:每一个分支,在判断完当前是否满足提交之后有两条路可以走,一条是GOTO L3也就是直接通过GOTO 去输出结果,同时判断结束,如果不满足当前提交,那么他就会去下一个分支对应的判断,重复上述操作,这个其实就是"老实人",一步一个脚印的走,直到完成操作,所以在if-else的判断中,是建议把大概率满足的条件,放在靠前的位置。

switch对应的字节码

在这里插入图片描述
对应的代码在这里插入图片描述

L0就不解释了,跟上面一样的
L1对应的就是switcw,观察可以看出,L1中从0-default 对应L1-L11,而对于L1-L11每一个都执行一个方法GOTO L12,这样其实看不出来性能好在哪,但是啊,L1里面有一个这样的字段TABLESWITCH,官方解释是什么呢

执行tableswitch 时,堆栈顶部的 int 值直接用作表中的索引,以获取跳转目标并立即执行跳转。整个查找+跳转过程是一个O(1) 操作,这意味着它非常快。

举个例子:假设此时a=5,此时switc中共有high-low+1分支项jvm遇到TABLESWITCH指令的时候,会监测a是否在low~higth范围内,如果不在这个范围内,会直接跳转到default,如果在这个范围内,那么就会用a指定的地点跳转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值