zoukankan      html  css  js  c++  java
  • switch与ifelse的效率问题

    switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。

    具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。


    由此看来,switch有点以空间换时间的意思,而事实上也的确如此。


    1.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。
    2.由上面的汇编代码可知道,switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。
    3.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。

    1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
    2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选
      择执行哪一个case的语句块
    3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
      一次。
    所以在多路分支时用switch比if..else if .. else结构要效率高。


    首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
    说到基本类型的数值比较,那当然要有两个数。然后重点来了——
    if 语句每一句都是独立的,看下面的语句:
    if (a == 1) ...
    else if (a == 2) ...
    这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
    于是 switch case 就出来了,把上面的改成 switch case 版本:
    switch (a) {
            case 0:
                    break;
            case 1:
    }

    3.
    因为当虚拟机读到switch的时候将所有的判断数据都加载在内存中了,而if是边判断边加载,所以就慢一些,
    一般如果判断数据不多,而且是byte,short,int或是char类型的时候一般用switch,那样效率比较高.

    Java中(C不知道):如果case中的值比较稀疏,则使用lookupswitch:

    可以看到其中的
     3: lookupswitch{ //4
    3: 44;
    20: 55;
    50: 66;
    100: 77;
    default: 85 }
    这个就要挨着查表确定跳转位置了。

  • 相关阅读:
    C# 利用ffmpeg 对视频转换系类操作 (1) 基本分析
    对象的行为
    类、对象、包
    java中的程序流程控制
    季节
    好的博客网址
    大家好 希望大家多多帮助
    Android 4.4 安卓系统突破限制让所有应用程序可操作外置SD卡
    STL笔记:函数配接器(Function adapters)
    STL中仿函数的简要回顾
  • 原文地址:https://www.cnblogs.com/balingybj/p/5751707.html
Copyright © 2011-2022 走看看