`
dawning126
  • 浏览: 46229 次
  • 性别: 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
分享到:
评论

相关推荐

    JavaScript中if与case比较

    这是因为`switch-case`在编译时会被优化成查找表或跳转表的形式,而`if-else if-else`则需要逐个条件地进行比较。 2. **比较的值为常量时**: - `switch-case`仅支持常量比较,这意味着它非常适合用于枚举类型的比较...

    Java逻辑基础题2-if和switch答案.docx

    这些题目展示了Java中的基本逻辑判断和条件语句的运用,包括if-else结构、逻辑运算符(&&, ||)、switch语句以及基本的算术运算。在编写Java代码解决实际问题时,比如练习1-6,我们需要根据条件判断来决定执行不同的...

    java学习资料-switch基础介绍及具体使用方法

    Java中的switch语句是一种多路分支的选择流程控制结构,它提供了比if-else语句更为简洁的代码形式,尤其在处理多个等值判断...在实际开发中,需要根据具体情况选择使用switch还是if-else,以达到最佳的代码质量和性能。

    php中switch与ifelse的效率区别及适用情况分析

    值得注意的是,if-else和switch语句的选择并不仅仅局限于性能的考虑,还包括代码的可读性和可维护性。在某些情况下,使用switch语句可以让代码更加清晰明了,尤其是在处理具有明确分类或等级制度的场景中。而在需要...

    if跟switch的区别

    ### if与switch的区别 在程序设计中,`if`与`switch`是非常常见的两种选择结构。...综上所述,`if` 和 `switch` 在使用时各有优势和限制。开发者应根据实际需求和上下文来选择最适合的条件判断结构。

    if语句的优化

    随着软件工程的发展和技术的进步,优化`if`语句成为了提高程序性能、减少资源消耗以及提升代码可读性和可维护性的重要手段。本文将深入探讨`if`语句的优化技巧及其应用场景。 #### 一、使用三元运算符简化代码 ...

    Java switch关键字原理及用法详解

    switch关键字的性能比if-else语句更高,因为它可以使用二分查找和哈希表来提高查找效率。 六、Switch的应用场景 switch关键字广泛应用于各种Java应用程序中,例如: * 根据不同的条件执行不同的代码块 * 实现枚举...

    9、ch6-matlab2010a编程

    在【例6.1-3】中,展示了如何使用`for`循环创建希尔伯特矩阵,并比较了不同的实现方式对性能的影响。`while`循环则在【例6.1-4】中被用来计算近似欧拉数,直到满足精度要求为止。这些示例不仅展示了循环的基本用法,...

    性能优化手册-202004版1

    此外,文档还提到了HashMap的遍历方式、switch语句的性能分析、if-else的优雅写法、GC优化、SQL编写建议、MySQL和Redis的性能优化实践等多方面的内容。这些都属于性能优化的重要组成部分。 对于HashMap,了解其遍历...

    选择结构程序结构设计PPT学习教案.pptx

    在某些情况下,switch语句比多层次的if-else结构更为简洁明了。 通过实例,我们看到如何使用这些运算符和语句来解决实际问题,比如找出两个数中的最大值或对输入的两个实数进行排序。理解并熟练运用选择结构是编程...

    PHP教程.pdf

    - PHP中的条件语句主要包括`if`、`if-else`、`if-elseif-else`和`switch`语句。 - `if`语句的基本格式是`if (condition) { // statement(s) }`。 - `if-else`结构允许在条件不成立时执行另一段代码。 - `switch`...

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

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

    北大青鸟java目录总结

    5. **Switch与if的比较**:switch通常比多个if-else更简洁,尤其是在处理大量情况时。然而,switch仅适用于有限的类型,如整型、字符型、枚举类型和String(自Java 7开始支持)。 ### 第四章 循环结构(一) 循环...

    swtich/if…else的替代语句

    `if...else` 和 `switch` 语句是两种常见的选择,它们都用于逻辑判断和流程控制。然而,当条件分支变得非常复杂时,这两种方式可能会显得不够优雅或可维护。在本文中,我们将探讨如何使用 `if...else`、`switch` ...

    Java基础精品课03-选择结构.zip

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者青睐。在Java的基础学习中,"选择结构"是至关重要的一个部分,它涉及到程序的逻辑控制,使得代码能够根据不同的条件执行不同的...

    3.3 用switch实现选择结构(ppt).zip

    `switch`语句提供了一种更简洁、更易读的多条件判断方法,相比传统的`if...else if...else`语句,它在处理大量可能的选项时更为高效。 **1. switch语句的基本结构** ```markdown switch(expression) { case value1...

    android switch 开关按钮

    `Switch`是自Android 4.0(API级别14)开始引入的新组件,相比于之前的`ToggleButton`,它提供了更加直观和友好的用户体验。 1. **Switch的基本用法** - `Switch`控件是`ToggleButton`的升级版,继承自`...

    Lua与JS差异,简明教程

    JavaScript使用if-else结构,Lua也支持if-then-elseif-else-end结构,但必须以“end”作为结束标记。 7. Switch语句差异 Lua不支持switch语句,而JavaScript中可以使用switch结构来处理多条件分支。 8. 消息框差异...

    Javascript高级程序设计---笔记.pdf

    switch语句则提供了一种多条件分支的选择结构,可以替代多个if-else if-else块。 函数在JavaScript中扮演着核心角色。函数不仅可以作为值传递,还可以用作对象的属性。arguments对象在函数内部提供了一个方便的方式...

Global site tag (gtag.js) - Google Analytics