黑马程序员技术交流社区
标题:
关于if else的效率问题
[打印本页]
作者:
郝强勇
时间:
2013-2-26 10:54
标题:
关于if else的效率问题
在看张老师的高新技术时,记得提到过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只取一次变量,这样提高的效率吗?请大仙们赐教!
作者:
郝强勇
时间:
2013-2-26 11:35
大哥,你粘的我从网上已经看到了,我是想问具体只这样吗?
作者:
刘凯
时间:
2013-2-26 12:30
貌似是这样的、、、
作者:
杨杨
时间:
2013-2-26 19:24
以前写代码没注意 现在学习了 以前老是困惑 sun公司真是多此一举 有if else 用switch (a)
作者:
孙传磊
时间:
2013-2-27 09:46
如果纯粹比较数字或字符,建议使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿
当然并不是使用if就不好,遇到复合条件时,switch就帮不上忙了,由于无法在switch中组合复杂的条件语句,这时就得使用if了。简单地说,if与switch两者可以搭配着灵活使用。
作者:
袁术森
时间:
2013-2-27 15:51
本帖最后由 袁术森 于 2013-2-27 16:02 编辑
If和switch语句的应用场景:
如果对具体个数的数值进行判断,用if可以,用switch也可,建议使用switch。因为switch 会将被选择的答案加载至内存中,选择效率稍高。
作者:
王宝生
时间:
2013-2-28 13:23
由于我们不是搞逆向分析的,所以不必太在意这方面的内容。事实上,关于if else,switch的性能分析有很多方面因素需要考虑,一般来说不要考虑它们的性能,而是应将注意力关注在可读性方面。
但是我还是说一下它们的性能影响,要想真正观察到它们的差别,需要反汇编查看汇编代码,这里我只是简单的说一下得了:
第一,switch中case数量小于3时,这时候使用if else和switch之间没有什么区别,汇编指令数(比较和跳转指令)基本上一样。当分支数量大于4时,编译器会对switch进行优化,性能可能由于if else。
第二,当case中的值是个线性排列时,譬如case 1, case 2....编译器会对其进行优化,这种优化对性能影响非常大,编译器会将每个case语句的首地址装入一个数组中,这样以后就直接查找这个数组就可以了。只知道有这么回事得了,这是编译器优化方法的知识。
如果你真的迫切想了解这方面的内容,最好的办法就是写一段代码,让后在调试器中运行,观看汇编代码。
作者:
王宝生
时间:
2013-2-28 13:26
因此,影响if else 和switch之间的性能因素不仅仅是switch中的变量会一次性装入寄存器中,其实这都是次要的。最重要的是我上面所说的第二点,编译器会对swithc中的case做优化。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2