`
dawning126
  • 浏览: 44982 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

switch和if-else性能比较

    博客分类:
  • C++
  • C
阅读更多
switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true.说实话  我也没有深入研究过这个问题的根源只是在实际开发中  没有人会去用很多很多else if的都是用 switch case 的  后者比较清晰  给人感觉就是一个脑子很清楚的人写出来的东西至于效率的本质  就让大企鹅去操心吧
编译器编译switch与编译if...else...不同。不管有多少case,都直接跳转,不需逐个比较查询。
昨天发现了一本叫做CSAPP的书,终于找到了关于switch问题的解答。
这是一段C代码:
/* $begin switch-c */
int switch_eg(int x)
{
    int result = x;

    switch (x) {

    case 100:
    result *= 13;
    break;

    case 102:
    result += 10;
    /* Fall through */

    case 103:
    result += 11;
    break;

    case 104:
    case 106:
    result *= result;
    break;

    default:
    result = 0;      
    }

    return result;
}
/* $end switch-c */

用GCC汇编出来的代码如下:
    .file    "switch.c"
    .version    "01.01"
gcc2_compiled.:
.text
    .align 4
.globl switch_eg
    .type     switch_eg,@function
switch_eg:
    pushl %ebp
    movl %esp,%ebp
    movl 8(%ebp),%edx
    leal -100(%edx),%eax
    cmpl ,%eax
    ja .L9
    jmp *.L10(,%eax,4)
    .p2align 4,,7
.section    .rodata
    .align 4
    .align 4
.L10:
    .long .L4
    .long .L9
    .long .L5
    .long .L6
    .long .L8
    .long .L9
    .long .L8
.text
    .p2align 4,,7
.L4:
    leal (%edx,%edx,2),%eax
    leal (%edx,%eax,4),%edx
    jmp .L3
    .p2align 4,,7
.L5:
    addl ,%edx
.L6:
    addl ,%edx
    jmp .L3
    .p2align 4,,7
.L8:
    imull %edx,%edx
    jmp .L3
    .p2align 4,,7
.L9:
    xorl %edx,%edx
.L3:
    movl %edx,%eax
    movl %ebp,%esp
    popl %ebp
    ret
.Lfe1:
    .size     switch_eg,.Lfe1-switch_eg
    .ident    "GCC: (GNU) 2.95.3 20010315 (release)"


在上面的汇编代码中我们可以很清楚的看到switch部分被分配了一个连续的查找表,switch case中不连续的部分也被添加上了相应的条目,switch表的大小不是根据case语句的多少,而是case的最大值的最小值之间的间距。在选择相应 的分支时,会先有一个cmp子句,如果大于查找表的最大值,则跳转到default子句。而其他所有的case语句的耗时都回事O(1)。

相比于if-else结构,switch的效率绝对是要高很多的,但是switch使用查找表的方式决定了case的条件必须是一个连续的常量。而if-else则可以灵活的多。

可以看到if-else只是单纯地一个接一个比较,效率比较低
可以看出,switch的效率一般比if-else高
switch   效率高,     从汇编代码可以看出来  
switch   只计算一次值   然后都是test   ,   jmp,    
if...else   是每个条件都要计算一遍的. 
switch的效率与分支数无关  
当只有分支比较少的时候,if效率比switch高(因为switch有跳转表)  
分支比较多,那当然是switch
分享到:
评论

相关推荐

    cmd操作命令和linux命令大全收集

    date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间 set 指定环境变量名称=要指派给变量的字符 设置环境变量 set 显示当前所有的环境变量...

    MATLAB程序设计实验.doc

    " " "编写程序演示控制结构的用法: " " "编写程序分别来演示循环(for、while)、分支(if-else-end " " "、switch-case)和异常处理(try-catch)控制结构的用法。 " " "3.编写程序分别演示以下命令的功能。...

    C++性能剖析教程之switch语句

    几乎每本面向初学者的C语言或C++书籍在前面两章都会提到分支控制语句if……else和switch……case,在某些情况下这两种分支控制语句可以互相替换,但却很少有人去深究在if……else和switch……case语句的背后到底有...

    Java面试题合集最新版2024.zip

    控制流语句:熟悉if-else、switch、for、while等控制流语句的用法。 面向对象编程:深入理解Java中的类、对象、继承、封装和多态等概念。 异常处理:了解try-catch-finally块的使用,以及自定义异常的处理。 二、...

    第一章C++视频介绍视频

    控制流语句:if-else, switch, for, while, do-while 函数定义与调用 数组与字符串 面向对象编程(OOP) 类与对象 封装、继承与多态 构造函数与析构函数 访问修饰符:public, private, protected 进阶特性 指针与...

    javascript性能问题

    1、注意作用域,尽量不要在作用域链中找全局变量; 2、避免不必要的属性查找:数组比对象快很...7、switch语句比if-else快 8、位运算符较快、 9、用一个var声明变量; 10、使用事件代理:利用事件冒泡; 作者:qq_777

    freemarker语法完整版

    if, else, elseif 语法 Java代码 <#if condition> ... <#elseif condition2> ... <#elseif condition3> ... ... <#else> ... </#if> <#if condition> ... <#elseif condition2> ... <#...

    paixu.rar_编译器/解释器_C/C++_

    当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。所以可以对case的值依照发生的可能性进行排序,把最有可能的放在第一位,这样可以提高...

    RakNet 网络库

    Raknet是一个基于UDP网络传输协议的C++网络库,允许程序员在他们自己的程序中实现高效的网络... else if (rakServerInterface)  RakNetworkFactory::DestroyRakServerInterface(rakServerInterface);  return 0;  }

    C语言解析教程(原书第4版)(美) 凯利.pdf

    4.7 if和if-else语句 4.8 while语句 4.9 for语句 4.10 例子:布尔变量 4.11 逗号操作符 4.12 do语句 4.13 例子:斐波那契数 4.14 goto语句 4.15 break和continue语句 4.16 switch语句 4.17 条件操作符 4.18 总结 ...

    Java 基础核心总结 +经典算法大全.rar

    if...else 条件语句if...else if 多分支语句switch 多分支语句 循环语句 while 循环语句do...while 循环for 循环语句 跳转语句 break 语句 continue 语句面向对象 类也是-种对象对象的创建 属性和方法 构造方法 方法...

    javascript两段代码,两个小技巧

    于是我就写成||&&形式的, 后来测试性能的时候,发现性能竟然上了一个数量级,可见这种写法在某些情况下可以增加性能,但是我并不确定是何种情况才能提高性能,因为我测试在通常情况下switch和||&&的性能是差不多的....

    C语言入门经典(第4版)--源代码及课后练习答案

    3.1.4 扩展if语句:if-else 84 3.1.5 在if语句中使用代码块 86 3.1.6 嵌套的if语句 87 3.1.7 更多的关系运算符 90 3.1.8 逻辑运算符 93 3.1.9 条件运算符 97 3.1.10 运算符的优先级 99 3.2 多项选择问题 103...

    RED HAT LINUX 6大全

    14.5 优化Samba性能 250 14.6 测试配置 251 14.7 运行Samba服务器 252 14.8 共享访问 252 14.8.1 在Linux客户上使用smbclient 252 14.8.2 在Linux客户上加载共享 253 14.8.3 在Windows客户上加载共享 253 14.9 公用...

    react-week8-assignment-1:CodeSum Week 8 Task React App装饰

    装饰您的餐厅应用使用Redux工具包删除动作创建者中... if可以使用, else不能使用。 请使用GuardClauses方法。 不能使用switch 。 let不能使用。 请仅使用const来解决问题。 缩写不能用于函数名称和变量名称。 即使很

    Visual C++ 2005入门经典--源代码及课后练习答案

    3.1.4 嵌套的if-else语句 107 3.1.5 逻辑运算符和表达式 109 3.1.6 条件运算符 112 3.1.7 switch语句 114 3.1.8 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    3.1.3 嵌套的if-else语句 107 3.1.4 逻辑运算符和表达式 109 3.1.5 条件运算符 112 3.1.6 switch语句 113 3.1.7 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 119 ...

    华为编程开发规范与案例

    1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和...

Global site tag (gtag.js) - Google Analytics