A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝强勇 中级黑马   /  2013-2-26 10:54  /  2218 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    在看张老师的高新技术时,记得提到过if else的效率比较低下,然后我就查资料寻求答案,基本说什么的也都有,有的我也看不懂,有一个说法我比较认同,就是if else语句相对于每一个语句块都是相互独立的,每个if判断的条件处都要进行一次判断的寄存,即如下:
char ch = '马';
if(ch=='黑'){
    //代码块1
}else if(ch=='马'){
    //代码块2
}else if(ch=='程'){
    //代码块3
}else if(ch=='序'){
    //代码块4
}else if(ch=='员'){
    //代码块5
}
而switch语句可以写成:
char ch = '马';
switch(ch){
    case '黑':
        //代码1
        break;
    case '马':
        //代码2
        break;
    ... ...
}
那么,仅仅是因为if 语句每次都把==两边的两个数据从内存取出来放到寄存区进行比较,
而switch只取一次变量,这样提高的效率吗?请大仙们赐教!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

8 个回复

倒序浏览
大哥,你粘的我从网上已经看到了,我是想问具体只这样吗?
回复 使用道具 举报
貌似是这样的、、、
回复 使用道具 举报
以前写代码没注意 现在学习了 以前老是困惑 sun公司真是多此一举 有if else 用switch (a)
回复 使用道具 举报
如果纯粹比较数字或字符,建议使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿
当然并不是使用if就不好,遇到复合条件时,switch就帮不上忙了,由于无法在switch中组合复杂的条件语句,这时就得使用if了。简单地说,if与switch两者可以搭配着灵活使用。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 袁术森 于 2013-2-27 16:02 编辑

If和switch语句的应用场景:
如果对具体个数的数值进行判断,用if可以,用switch也可,建议使用switch。因为switch 会将被选择的答案加载至内存中,选择效率稍高。

回复 使用道具 举报
   由于我们不是搞逆向分析的,所以不必太在意这方面的内容。事实上,关于if else,switch的性能分析有很多方面因素需要考虑,一般来说不要考虑它们的性能,而是应将注意力关注在可读性方面。
    但是我还是说一下它们的性能影响,要想真正观察到它们的差别,需要反汇编查看汇编代码,这里我只是简单的说一下得了:
   
    第一,switch中case数量小于3时,这时候使用if else和switch之间没有什么区别,汇编指令数(比较和跳转指令)基本上一样。当分支数量大于4时,编译器会对switch进行优化,性能可能由于if else。
    第二,当case中的值是个线性排列时,譬如case 1, case 2....编译器会对其进行优化,这种优化对性能影响非常大,编译器会将每个case语句的首地址装入一个数组中,这样以后就直接查找这个数组就可以了。只知道有这么回事得了,这是编译器优化方法的知识。
   
    如果你真的迫切想了解这方面的内容,最好的办法就是写一段代码,让后在调试器中运行,观看汇编代码。
   
   
回复 使用道具 举报
   因此,影响if else 和switch之间的性能因素不仅仅是switch中的变量会一次性装入寄存器中,其实这都是次要的。最重要的是我上面所说的第二点,编译器会对swithc中的case做优化。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马