zoukankan      html  css  js  c++  java
  • if else 和 switch case 总结

    关于两者的优缺点如下:

    1.if else的优缺点

      缺点:效率低(相对于switch)

      优点:使用灵活,代码空间小

    2.switch的优缺点

       缺点:不够灵活,switch仅支持 int,char,unsigned char 等基本类型;代码空间大。

       优点:代码结构清晰,效率高

    其实,对于if else 作为关键字而言,效率还是可以的。

    下面是一个比较权威的说法:

    《C++ Footprint and Performance Optimization》的7章,第一节。
    然后根据大量的实际程序测试(不考虑不同的编译器优化程度差异,假设都是最好的优化),那么Switch语句击中第三个选项的时间跟if/else if语句击中第三个选项的时间相同。
    击中第一,第二选项的速度if语句快,击中第四以及第四之后的选项的速度switch语句快。

    switch底层执行原理     

       switch语句根据一个整数索引值进行多重分支,底层采用跳转表这种数据结构。跳转表是一个数组,表项 i 对应代码段的地址,当switch索引值等于表项i时采取对应的程序操作。

    简单可理解为:执行switch时生成一个长度为最大case常量+1的数组,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得数组索引号为switch变量值大小,取得数组对应值即为相应case代码块地址,程序接着跳到此地址执行,完成分支的跳转。

     对于if-else,在系统是自上而下逐个条件去判断,直到命中;所以应将机率大的条件置于最前面。以下给出一个简单例子

    var random = Math.random()*100;//生成0-100的随机数
    if(random > 10){ //90%
    
    }else if(random > 5){//5%
    
    }else{//剩下的5%
    
    }

    对于条件机率相等或是条件个数非常多的情况,因为switch的执行时间与条件数量无关,他是根据switch值直接跳转到对应分支,所以可以选择switch代替if-else。

    var random = Math.random() * 100;// 生成0-100的随机数
       switch (random) {
        case 0:
            break;case 100:
            break;
       }

    对于switch,实际上是根据case最小值与最大值,维系了一段连续的内存空间,以空间换取时间。以下给出一个简单的反例,最大值与最小值跨度较大,且之间没有更多的条件情况,那个无疑实际申请的很多空间是没用的,所以就应考虑使用if-else在代替。

    总结:.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (x > 1 && x < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。

  • 相关阅读:
    Vector(同步)和ArrayList(异步)异同
    集合框架(1)
    如何优化limit
    Mysql5大引擎之间的区别和优劣之分
    差分约束 poj 3169
    最大权森林 poj 3723
    次短路 poj 3255
    P1604 B进制星球 (高精度进制计算器)
    最小生成树入门 kruskal和堆优化的prim
    并查集入门 POJ 1182(带权并查集)
  • 原文地址:https://www.cnblogs.com/zxrbky/p/9466649.html
Copyright © 2011-2022 走看看