zoukankan      html  css  js  c++  java
  • switch 比 if/else 效率更高?

    switch 比 if/else 效率更高?

    在很多人的概念里,switch 的执行效率是比 if/else 高的。依据就是很多人以为的,if/else 是用了多次比较判断,而 switch 是用的跳转表一次跳转。事实真的是这样吗?

    考察以下几个例子,switch 改成 if/else 之后效率会变化很多吗?

    【例1】

    int x = GetIntValue();
    switch(x) {
    case 1: // do something
    case 2: // do something
    case 3: // do something
    // ...
    case 32: // do something
    default: // do something
    }
    

    【例2】

    int x = GetIntValue();
    switch(x) {
    case 1: // do something
    case 12: // do something
    case 123: // do something
    // ...
    case 123456789: // do something
    default: // do something
    }
    

    【例3】

    int x = GetIntValue();
    switch(x) {
    case 1: // do something
    case 2: // do something
    case 3: // do something
    default: // do something
    }
    

    注意,跳转表其实是一个数组,并不是python/javascript “表驱动” 编程的那种哈希表。
    对于第一个例子,case范围集中,用跳转表确实比用if/else 判断要好一些,编译器只需要使用一个大小为32的跳转表,跳转前判断一下是否在表范围内,然后查表一次就可以了。
    对于第二种情况,case非常分散,如果使用跳转表的话,表要开多大、跳转要几次?如果我们希望仍然跳转一次,那么表的大小就要开的很大。实际上,编译器在面临这种情况时的处理方式是 —— 存入一个小的数组然后使用二分查找的方式来进行查询,实际查表 logN 次。
    对于最后这种情况,case很少,编译器会直接转化成if/else来判断,没有区别。

    有人曾经做过测试 为什么很多程序员不用 switch,而是大量的 if...else if ...? - 詹姆斯.通的回答 - 知乎,100个case以内,if/else 和 switch 性能差别很小,超过 450 个case 才出现显著差距。实际上,现代编译器已经足够聪明,会根据case的情况,自动选择合适的方式来实现 switch,也会主动优化 if/else 的实现逻辑。

    所以,我们编程的时候,不要着眼于这种小细节上的过度优化,处理好代码逻辑,然后选择相信编译器就好了。毕竟,代码99%的时间是用来给人读的,只有1%的时间是给机器来运行的。

  • 相关阅读:
    新概念英语(1-25)Mrs. Smith's Kitchen
    新概念英语(1-23)Which glasses?
    新概念英语(1-21)Whick book
    BZOJ2212: [Poi2011]Tree Rotations(线段树合并)
    BZOJ4773: 负环(倍增Floyd)
    洛谷P1155 双栈排序(贪心)
    洛谷P1024 一元三次方程求解(数学)
    洛谷P1072 Hankson 的趣味题(数学)
    2018.10.26NOIP模拟赛解题报告
    洛谷P2831 愤怒的小鸟(状压dp)
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15222627.html
Copyright © 2011-2022 走看看