`
weiqingeng
  • 浏览: 914 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

if else 和 switch的效率

    博客分类:
  • Java
 
阅读更多

switch在判断分支时,没有判断所有的可能性,而是用一个静态表来解决这个问题,所以速度要比if-else快。
但是,switch对较复杂的表达式进行判断,所以当我们需要判断一些简单数值时,用switch较好。

 

下面是转载的内容,我看说的很有道理

 

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

分享到:
评论

相关推荐

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

    本文实例分析了php中switch与if...1、当被判断的值是常量(固定不变的值)时,switch的运行效率比ifelse的运行效率高; $changliang=3; // 变判断的值为常量 switch($changliang){ case 1: echo '常量值为1'; break;

    Java学习,if--else练习

    expression1 : expression2`)作为简化的`if-else`表达式,或者利用`switch`语句(虽然标签中没有提到,但它是另一种条件控制结构)来处理多个可能的值。 总的来说,理解和熟练运用`if`和`else`是Java初学者的必备...

    Objective-C else if 范例

    可能已失效,建议寻找最新可用的资源)中,他可能会详细解释`else if`的用法,包括与其他控制结构(如`switch`语句)的比较,以及如何优化条件检查以提高代码效率。 总之,`else if`在Objective-C中是实现条件逻辑...

    (四)--switch与if的效率.pdf

    但是,很多开发者不知道如何选择使用 switch 或 if,以至于代码的效率和可读性受到影响。在本文中,我们将详细比较 switch 与 if 的效率差异,并讨论何时使用 switch 何时使用 if。 首先,让我们来看看 switch 语句...

    详解C语言中条件判断语句if和switch的用法

    本文将深入探讨两种主要的条件判断语句:`if`和`switch`。 `if`语句是C语言中最基础的条件判断语句,用于根据一个条件来决定是否执行一段代码。它有三种基本形式: 1. **单行if语句**: ```c if(条件表达式) { ...

    浅谈选择结构if语句和switch语句的区别

    - 效率:对于简单的相等比较,switch通常比if语句更快,因为编译器可以生成更优化的代码。 - 代码可读性:当有多个等价条件时,switch结构的可读性往往优于嵌套的if-else结构。 - 控制流程:switch不支持逻辑运算符...

    JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)

    在JavaScript编程中,逻辑判断是不可或缺的一部分,但随着代码复杂度的增加,传统的if-else和switch语句可能会导致代码变得难以维护。本篇文章将探讨如何编写更优雅、更简洁的逻辑判断,以应对复杂的场景。 首先,...

    优化if/else测试代码包cheng.rar

    在编程领域,优化if/else语句的使用是提高代码可读性、可维护性和执行效率的重要手段。这里我们探讨的“优化if/else测试代码包”提供了两种不同的方法来解决这个问题:策略模式+工厂模式以及使用枚举。这两种方法各...

    if语句的优化

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

    If-Else-Block-Refactoring:使用嵌套的ifelse代码块重构业务逻辑

    5. **使用开关表达式(Switch Expressions)**:Java 12引入了switch表达式,可以更简洁地替代长链的`if-else`。这种方式在保持代码简洁的同时,还提供了更好的类型安全。 6. **使用决策表(Decision Table)**:...

    C语言switch语句学习教案.pptx

    当然可以使用嵌套的 if , if else 语句来处理,但其分支过多,程序冗长,难读,不够灵巧。 switch 语句的基本语法结构为: ```c switch(表达式) { case 常量表达式 1: 语句 1 [break]; case 常量表达式 2: ...

    bool-adjust.rar_If..._LABVIEW多条件_switch labview

    标题 "bool-adjust.rar_If..._LABVIEW多条件_switch labview" 暗示了这个压缩包中的资源是关于在LabVIEW中实现类似C#语言中的条件判断结构,如if...else和switch语句的。LabVIEW(Laboratory Virtual Instrument ...

    switch语句和exe

    `switch`语句常用于替代一系列的`if...else if...else`语句,使其代码更简洁、易读。 `switch`语句的基本语法如下: ```c switch(expression) { case value1: // code block to be executed if expression ...

    jsp自定义标签之ifelse与遍历自定义标签示例.docx

    与`if-else`相比,`switch-case`在某些情况下可以提供更清晰的代码结构,尤其是在处理多个等价条件时。此外,JavaScript的三目运算符(`condition ? expressionIfTrue : expressionIfFalse`)则是另一种简洁的条件...

    JavaScript中if与case比较

    - 当条件分支较多时,`switch-case`语句通常比`if-else if-else`语句执行效率更高。 #### 性能比较 在大多数情况下,`switch-case`结构与多个`if-else`结构的性能差异并不显著。然而,在某些特定情况下,`switch-...

    7enum和switch语句联合案例分析VC共6页.pdf

    与多个`if...else if...else`语句相比,`switch`通常更简洁、高效: ```cpp switch (color) { case Red: // 处理红色 break; case Green: // 处理绿色 break; case Blue: // 处理蓝色 break; default: /...

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

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

    if语句 、switch语句 、for循环、break、continue、while、do-while

    合理使用这些语句可以提高代码的效率和可读性,降低编程复杂性。在实际编程中,根据需求选择合适的控制流程语句是解决问题的关键。理解并熟练掌握这些基础语句,能为你的编程生涯奠定坚实的基础。

Global site tag (gtag.js) - Google Analytics