在很多人的概念里,switch 的执行效率是比 if/else 高的。依据就是很多人以为的,if/else 是用了多次比较判断,而 switch 是用的跳转表一次跳转。事实真的是这样吗? 考察以下几个例子,switch 改成 if/else 之后效率会变化很多吗? 【例1】 int x = GetIntValue();switch(x) {case 1: // do somethingcase 2: // do somethingcase 3: // do something// ...case 32: // do somethingdefault: // do something}【例2】 int x = GetIntValue();switch(x) {case 1: // do somethingcase 12: // do somethingcase 123: // do something// ...case 123456789: // do somethingdefault: // do something}【例3】 int x = GetIntValue();switch(x) {case 1: // do somethingcase 2: // do somethingcase 3: // do somethingdefault: // do something}CPP 复制 全屏
注意,跳转表其实是一个数组,并不是python/javascript “表驱动” 编程的那种哈希表。
对于第一个例子,case范围集中,用跳转表确实比用if/else 判断要好一些,编译器只需要使用一个大小为32的跳转表,跳转前判断一下是否在表范围内,然后查表一次就可以了。
对于第二种情况,case非常分散,如果使用跳转表的话,表要开多大、跳转要几次?如果我们**仍然跳转一次,那么表的大小就要开的很大。实际上,编译器在面临这种情况时的处理方式是 —— 存入一个小的数组然后使用二分查找的方式来进行查询,实际查表 logN 次。
对于最后这种情况,case很少,编译器会直接转化成if/else来判断,没有区别。
|