黑马程序员技术交流社区

标题: if else 为什么比switch执行效率低 [打印本页]

作者: 陈帅雷    时间: 2011-12-21 23:18
标题: if else 为什么比switch执行效率低
本帖最后由 陈帅雷 于 2011-12-22 09:24 编辑

if else 为什么比switch执行效率低,张老师视频中的问题,研究研究{:soso_e100:}
作者: 王胜利    时间: 2011-12-21 23:37
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
        case 0:
                break;
        case 1:
}
因为特定的规则,他一开始就知道你要比 a,于是 a 一次性读取,相比 if 节约了很多开销。
作者: 于汝国    时间: 2011-12-22 00:21
switch 只判断一次,就可以直接运行相应的 case 里面的语句。switch-case可以用在简单的判断上。
而if else要判断很多次,每一种情况都要从开始进行比较, 比如一个结果在最后的一个 else里面,则需要把前面的if全判断一遍。
所以switch的效率要比if else 高。
作者: 李娟    时间: 2011-12-22 08:46
switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true. 说实话  我也没有深入研究过这个问题的根源 只是在实际开发中  没有人会去用很多很多else if的 都是用 switch case 的  后者比较清晰  给人感觉就是一个脑子很清楚的人写出来的东西,至于效率的本质,编译器编译switch与编译if...else...不同。不管有多少case,都直接跳转,不需逐个比较查询。
作者: 韩金蕊    时间: 2011-12-22 09:09
int a = 5;
switch(a)
{
case 1: cout << '1';
break;
case 2; cout << '2';
break;
case 3:cout << '3';
break;
case 4:cout << '4';
break;
case 5:cout << '5';
break;
default:cout "no";
}



if (1==a)
   cout << '1';
else if(2==a)
   cout << '2';
else if(3==a)
   cout << '3';
else if(4==a)
   cout << '4';
else if(5==a)
   cout << '5';
else
   cout << "no";



首先看上面的例子,switch语句只是判断当a等于多少时,直接判断相应的语句,而if else需要判断多个语句,所以switch比if else执行效率要高。
作者: 郝锡强    时间: 2011-12-22 09:25
我感觉如果只是
if(true)
{}
else
{}
那就和switch没什么区别,如果多个ifelse就不如switch了嘛,判断的多了就效率低了,switch是树查找




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2