switch为什么比if else效率高?????
switch不是也要依次比较case吗?
和if差不多啊,为什么效率要高呢?
[解决办法]
一样..
至少同样的编程水平下.以现在的编译器的优化能力..完全一样.
[解决办法]
因为switch的条件简单,编译器会为它做二分法优化(或跳转表).平均性能要高一点.而if else所比较的条件会远远比switch的复杂,编译器通常不会做过多的优化.当然你可以手工优化....
一般情况下,是差不多的.
[解决办法]
switch 只能作常数位参数
在编译时就一个CMP X,Y就可以了 ~!
而IF的表达式很复杂
[解决办法]
胡扯 and switch的效率体现在可读性上 if 你用的是C
[解决办法]
差不多,但是if 的比较相对来说功能要强大点.
因此,有理由相信if 有些情况下,做不到switch的优化程度.
[解决办法]
编译器的优化能力远超你的想象。switch和if else没有明显效率差的。
[解决办法]
不能看表面的东东
[解决办法]
有那么明显的差距吗?
[解决办法]
switch不是也要依次比较case吗?
和if差不多啊,为什么效率要高呢?
____________________________________
谁说的 托出去斩了
[解决办法]
For example:
switch(n){
case 0:
fun0();
break;
case 1:
fun1();
break;
case 2:
fun2();
break;
default:
fun();
break;
}
The compiler could generation code like:
fun_type fun_list[]={fun0,fun1,fun2};
if(n <0||n> 2)fun();
else fun_list[n]();
Using switch provide more precise information to the compiler.
But if the code is simple enough, the compiler may be able to transform elseif list into switch too.[no side-effect]
[解决办法]
switch不是也要依次比较case吗?
和if差不多啊,为什么效率要高呢?
____________________________________
谁说的 托出去斩了
==================
switch是在无break的条件时,顺序执行各case,^_^
[解决办法]
mathe的分析很好。
[解决办法]
这个问题你最好自己看一下编译后的汇编代码
源程序:
int a = 0;
switch(a)
{
case 0:
printf( "%d ", a);
break;
case 1:
printf( "%d ", a);
break;
case 2:
printf( "%d ", a);
break;
}
编译后的汇编代码
13: switch(a)
14: {
0040102F mov eax,dword ptr [ebp-4] //
00401032 mov dword ptr [ebp-8],eax
00401035 cmp dword ptr [ebp-8],0 //
00401039 je main+39h (00401049)
0040103B cmp dword ptr [ebp-8],1
0040103F je main+56h (00401066)
00401041 cmp dword ptr [ebp-8],2
00401045 je main+73h (00401083)
00401047 jmp main+8Eh (0040109e) // 比较后 再跳转到相应代码
15: case 0:
16: printf( "%d ", a);
00401049 mov esi,esp
0040104B mov ecx,dword ptr [ebp-4]
0040104E push ecx
0040104F push offset string "%d " (0041301c)
00401054 call dword ptr [__imp__printf (004150a4)]
0040105A add esp,8
0040105D cmp esi,esp
0040105F call _chkesp (004010e0)
17: break;
00401064 jmp main+8Eh (0040109e)
18: case 1:
19: printf( "%d ", a);
00401066 mov esi,esp
00401068 mov edx,dword ptr [ebp-4]
0040106B push edx
0040106C push offset string "%d " (0041301c)
00401071 call dword ptr [__imp__printf (004150a4)]
00401077 add esp,8
0040107A cmp esi,esp
0040107C call _chkesp (004010e0)
20: break;
00401081 jmp main+8Eh (0040109e)
21: case 2:
22: printf( "%d ", a);
00401083 mov esi,esp
00401085 mov eax,dword ptr [ebp-4]
00401088 push eax
00401089 push offset string "%d " (0041301c)
0040108E call dword ptr [__imp__printf (004150a4)]
00401094 add esp,8
00401097 cmp esi,esp
00401099 call _chkesp (004010e0)
23: break;
24: }
源程序:
int a = 0;
if(a==0)
{
printf( "%d ", a);
}
else if(a==1)
{
printf( "%d ", a);
}
else if(a==2)
{
printf( "%d ", a);
}
编译后的汇编代码
2:
13: if(a==0)
0040102F cmp dword ptr [ebp-4],0 // 第一次判断
00401033 jne main+42h (00401052)
14: {
15: printf( "%d ", a);
00401035 mov esi,esp
00401037 mov eax,dword ptr [ebp-4]
0040103A push eax
0040103B push offset string "%d " (0041301c)
00401040 call dword ptr [__imp__printf (004150a4)]
00401046 add esp,8
00401049 cmp esi,esp
0040104B call _chkesp (004010e0)
16: }
17: else if(a==1)
00401050 jmp main+86h (00401096)
00401052 cmp dword ptr [ebp-4],1 // 第二次判断
00401056 jne main+65h (00401075)
18: {
19: printf( "%d ", a);
00401058 mov esi,esp
0040105A mov ecx,dword ptr [ebp-4]
0040105D push ecx
0040105E push offset string "%d " (0041301c)
00401063 call dword ptr [__imp__printf (004150a4)]
00401069 add esp,8
0040106C cmp esi,esp
0040106E call _chkesp (004010e0)
20: }
21: else if(a==2)
00401073 jmp main+86h (00401096)
00401075 cmp dword ptr [ebp-4],2
00401079 jne main+86h (00401096)
22: {
23: printf( "%d ", a);
0040107B mov esi,esp
0040107D mov edx,dword ptr [ebp-4]
00401080 push edx
00401081 push offset string "%d " (0041301c)
00401086 call dword ptr [__imp__printf (004150a4)]
0040108C add esp,8
0040108F cmp esi,esp
00401091 call _chkesp (004010e0)
24: }
最后的结论,if 和switch这两种判断方法都有自己的优势,其效率高低之在于与编译器对其优化程度。switch效率一定是高于if的,高也高不了多少,如果你编程仅仅是windows的话,就无所谓了if还是switch了。
祝你好运
[解决办法]
switch的编译优化比较方便,比IF的流水线分析简单,而且优化得更好
当然一般不会很明显
[解决办法]
<C++高效编程:内存与性能优化>
有过关于swtich与if的性能对比
他们的阀值为3,也就说
少于3的判断,采用if方式,效率比swtich高
而对于大于3个判断,swtich效率比if要高。
而swtich的执行过程,是从default开始的。
[解决办法]
yonghen21(非也)
和
ugg(逸学堂(exuetang.net))
都对~~
[解决办法]
同意ugg(逸学堂(exuetang.net))的观点
[解决办法]
至于说“为什么switch在某些情况下会比if效率高”,因为编译器往往比你聪明。
[解决办法]
不发表评论
[解决办法]
保持沉默
[解决办法]
其实说这个都没什么意义~~
即使在单片机上,也不会为了这点效率而放弃可读性
[解决办法]
axx1611说的有道理!
[解决办法]
no comment!
[解决办法]
今天终于找到这本书 <C++高效编程:内存与性能优化> 了,也算是给大家一个交待。
因为是纸版,无法把上面的测试数据拷贝下来(实在懒得写下来,找50m吧,她有精力)
测试结果,正如我上面的结论所属。
测试程序可以到www.samspublishing.com网站上找
当然对于不同的版本的编译器,可能最终的结果并不同于书上的测试结果,这也是书上提到的
因为标准中没有规定if else,switch case的效率,所以不要较真。
btw: <C++高效编程:内存与性能优化> 第7章基本编程语句之7.1.4选择语句的性能比较
如果想多了解一些,请私下找我
[解决办法]
mathe
所举的例子,正好是对于少量case下的编译器使用ifelse代替case的情况。
swtich是一般是使用转移表实现,如mathe的例子。
[解决办法]
不要老拿XXX的书来说话
要想真搞研究 光看书有什么用
要自己研究出一套 有依据的测试方法,再弄个测试程序。
然后自己测试一下,用实践来严正这东西。
这才是真正 想高明白问题 的方式。
要是光凭空想象分析吗。
我觉得 SWITCH可能会快一点点,但是从经验上看不会照IF ELSE结构快太多。
从理论上说 SWITCH 是不是 源于 IF ELSE 呢??
可能后来做了写优化???
这都只是猜测。
大家继续畅所欲言!
[解决办法]
当有大量的比较的时候,switch的效率应该高一点。
switch的case条件都是编译期整数常量,编译器可以做到表格跳转查询,查找速度快,
缺点是:case条件都是编译期整数常量
if/else是一个挨一个的查询,速度较慢,
优点是:不限比较类型和内容,你可以使用double,float,string或是自定义类型,比较双方不必是编译期常量。
[解决办法]
switch (1 ~ 100000)
if(1){}elseif(2)elseif(3)
那个快?switch快
[解决办法]
主要原因就是对于switch,编译器生成的代码常常并不是一个一个的比较,而是更优化的方式,比如跳转表。而对于if/else,比较难说。
[解决办法]
FPGA设计的指导原则
http://www.mcu123.com/news/Article/fpga/FPGA/200607/50.html
[解决办法]
不一样的,分情况,有时if else 快,有时switch快