首页
学习
活动
专区
圈层
工具
发布

【揭秘】为什么switch...case比if...else执行效率高

作者:李肖遥 来源:技术让梦想更伟大 在C语言中,条件判断语句是程序的重要组成部分,也是系统业务逻辑的控制手段,教科书告诉我们switch...case...语句比if...else if...else...switch...case与if...else的根本区别 switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。...从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。...具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch......case...语句相对于if...else if...else...来说执行效率要高的根本原因。

4.5K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    switch...case与if...else执行能力分析

    switch...case与if...else作为条件判断语句在程序中用的是非常多的。...对比 基本用法 // switch switch( 条件表达式 ){ case a: // do something break; case b: // do something...简单可理解为:执行switch时生成一个长度为最大case常量+1的数组,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得数组索引号为switch变量值大小...所以,switch语句的执行速度相对于if语句执行速度会更快。但是因为switch会生成一个临时的数组,所以,占用的内存可能会更大。...所以,在只是处理常量的时候,推荐使用 switch 语句判断,如果涉及到了表达式,那么推荐使用 if…else 语句进行判断。

    1.1K10

    【OpenHarmony】TypeScript 语法 ③ ( 条件语句 | if else 语句 | switch case 语句 )

    ("未成年"); } 在 https://ts.nodejs.cn/play 中运行 TypeScript 代码 : [LOG]: "成年了" 2、switch case 语句 TypeScript...语言 的 switch case 语句 语法 与 JavaScript 语言 基本相同 , 该条件语句结构可以根据 一个表达式的值 来执行不同的 case 代码块中的代码 ; switch case...语法 : switch (expression) { case value1: // 当 expression 表达式值 等于 value1 时执行该代码块...的值匹配 , 那么 将执行该 case 下的代码 , 直到遇到 break 语句或者整个 switch 语句结束 ; 终止条件 : break 语句的作用是 终止 switch 语句的执行 , 直接跳出...switch 分支结构 , 如果连续多个 case 语句之间没有 break 关键字 , 会继续继续执行下一个 case 代码块 , 直到遇到下一个 break 关键字 或者 switch 语句执行结束

    68510

    知识扩展--if...else...与switch...case...的执行原理if和switch的原理

    一、简述   编程语言中的条件分支结构有两种:if-else和switch-case,这两种条件分支之间可以相互转换,但是也存在一些区别,那么什么时候该用if-else,什么时候该用switch-case...if(条件1){   if(条件2){     代码块1   }else{     代码块2   } }else{   代码块3 } 1.2 switch...case...简述   switch语句的基本结构如下...2.2 switch...case...执行原理   switch是另一种比较常用的多分支结构,在使用上比较简单,效率上也比if...else if...else高,下面将分析switch结构的实现:...比如下面的这个判定树,首先与10进行比较,根据与10 的大小关系进入左子树或者右子树,再看看左右子树的分支是否不大于3,若不大于3则直接转化为对应的if...else if... else结构,大于3则检测分支是否满足上述的优化条件...具体地说,switch-case会生成一份表项数为case量+1的跳表,程序首先判断switch变量是否大于(小于)最大(最小)case 常量,若大于(小于),则跳到default分支处理;否则取得索引号为

    1.7K30

    C++11--使用表驱动(Table-Driven)模式消除if-else和switch-case语句

    常见的实现途径是通过if-else或者switch-case的方式来实现,如下代码所示: const std::string GetDayName(const int day) { std::string...else if(day == 3){ dayName = "星期三"; } else if(day == 4) { dayName = "星期四"; } else if(day...== 5) { dayName = "星期五"; } else if (day == 6) { dayName = "星期六"; } else if(day==0) {...1、简单的表驱动实现 如何解决写出更加优雅的代码来消除if-else/switch-case语句,表驱动法(Table-Driven Approach)是一种可选的方法。...上述表驱动方法虽然对于消除长的if-else语句、提高代码质量很有用,但是一般的表驱动难以重用。因为不同的业务有不同的场景,不同的逻辑分支,这些都导致上述的表驱动的方式实现不够通用。

    2.4K20

    【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )

    3、switch case end 分支结构 一、MATLAB 流程控制结构 ---- MATLAB 流程控制结构 : 顺序结构 : 默认从上到下执行 ; 分支结构 : if else end switch...end 分支结构 if else end 分支结构语法 : 如果 条件表达式 成立 , 执行 " 执行语句1 " , 否则执行 " 执行语句2 " ; if 条件表达式 // 执行语句 1 else...: 3、switch case end 分支结构 switch case end 分支结构语法 : 通过表达式的值进行比较 , 通过不同的比较结果 , 实现分支功能 ; 如果所有语句都不满足 , 跳转到...otherwise 分支 , 如果没有定义 otherwise 分支 , 则直接跳出到 end ; switch 表达式 case 表达式1 执行语句1 case 表达式2 执行语句2...otherwise 执行语句n end 代码示例 : %% switch case end 分支结构 score = 100 switch score case 60 '

    12.6K50

    【万字长文】C语言高效编程与代码优化,建议收藏!

    N标志表示结果是否是负值,Z标志表示结果是否是0。...dostuff2(); else if (val == 3) dostuff3(); 使用switch可能更快: switch( val ) { case 1:...当值的范围足够小,定点算数操作比浮点运算更精确、更快速。 其他技巧 通常,可以使用空间换时间。如果你能缓存经常用的数据而不是重新计算,这便能更快的访问。...一维数组比多维数组更快。 编译器可以在一个文件中进行优化-避免将相关的函数拆分到不同的文件中,如果将它们放在一起,编译器可以更好的处理它们(例如可以使用inline)。 单精度函数比双精度更快。...浮点乘法运算比浮点除法运算更快-使用val*0.5而不是val/2.0。 加法操作比乘法快-使用val+val+val而不是val*3。 put()函数比printf()快,但不灵活。

    1.9K20

    C语言高效编程与代码优化

    dostuff2();else if (val == 3) dostuff3(); 使用switch可能更快: switch( val ){ case 1: dostuff1...}else{            /* a must be 8 */ } }} 比较如下两种case语句: 慢而低效的代码: c=getch();switch(c){ case...当值的范围足够小,定点算数操作比浮点运算更精确、更快速。 其他技巧 通常,可以使用空间换时间。如果你能缓存经常用的数据而不是重新计算,这便能更快的访问。...一维数组比多维数组更快。 编译器可以在一个文件中进行优化-避免将相关的函数拆分到不同的文件中,如果将它们放在一起,编译器可以更好的处理它们(例如可以使用inline)。 单精度函数比双精度更快。...浮点乘法运算比浮点除法运算更快-使用val*0.5而不是val/2.0。 加法操作比乘法快-使用val+val+val而不是val*3。 put()函数比printf()快,但不灵活。

    3.4K10

    数据说话:Go语言的Switch和Map性能实测

    通常我会选用switch语句。还有个更加可读的实现方法是使用函数map。我一开始认为用switch语句进行分支跳转比一个map查找和函数调用更快。...我找到的几个帖子都认为map在有足够多跳转分支时会更快。一个在2012年对switch优化的讨论包括了Ken Thompson的观点。他认为没有太多优化的空间。...switch i % 4 { case 0: n += f0(i) case 1: n += f1(i)...结果显示map版本在4个分支的情况下比switch版本慢了25%。在8个分支的情况下它们的性能相当。map版本在分支越多的情况下越快,在512个分支的测试里它会比switch版本快50%。...结论 我最初想回答的问题是,用函数map来替换switch语句对性能是否会有影响。我假设switch语句会快一点。但是我错了。Map通常会更快,而且快好几倍。

    2.6K50

    JavaScript 性能优化

    加载与执行 将标签放在前面,不要放在中,防止造成堵塞 尽量减少请求,单个100KB的文件比4个25KB的文件更快,也就是说减少页面中外链的文件会改善性能 尽量使用压缩过的...JS文件,体积更小,加载更快 数据存取 使用局部变量和字面量比使用数组和对象有更少的读写消耗 尽可能使用局部变量代替全局变量 如无必要,不要使用闭包;闭包引用着其他作用域的变量,会造成更大的内存开销 原型链不要过深...,因为for-in循环要搜索原型属性 限制循环中耗时操作的数量 基于函数的迭代forEach比一般的循环要慢,如果对运行速度要求很严格,不要使用 if-else switch,条件数量越大,越倾向于使用...switch 在判断条件多时,可以使用查找表来代替if-else switch,速度更快 switch(value) { case 0: return result0 break...会经历四个步骤: 在内存中创建一个临时字符串 连接后的字符串 onetwo 被赋值给该临时字符串 临时字符串与str当前的值连接 结果赋值给str str += 'one' str += 'two' 第二种方式比第一种方式要更快

    1.1K20

    干货!嵌入式C语言源代码优化方案

    m = i / j / k; 推荐的代码: int i,j,k,m; m = i / (j * k); (6)使用增量和减量操作符 在使用到加一和减一操作时尽量使用增量和减量操作符,因为增量符语句比赋值语句更快...因为编译器不知道指针之间是否存在冲突,所以指针型参数往往不能被编译器优化。这样数据不能被存放在寄存器中,而且明显地占用了内存带宽。...当switch用比较链的方式转化时,编译器会产生if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳转到满足条件的语句执行。...语句 当switch语句中的case标号很多时,为了减少比较的次数,明智的做法是把大switch语句转为嵌套switch语句。...把发生频率高的case 标号放在一个switch语句中,并且是嵌套switch语句的最外层,发生相对频率相对低的case标号放在另一个switch语句中。

    3K40

    if快还是switch快?解密switch背后的秘密

    switch VS if 我在之前的文章《9个小技巧让你的 if else看起来更优雅》中有提过,要尽量使用 switch 因为他的性能比较高,但具体高多少?以及为什么高的原因将在本文为你揭晓。...从 Score 的值可以看出,当分支判断增加至 15 个,switch 的性能比 if 的性能高出了约 3.7 倍,而之前有 5 个分支判断时的测试结果为,switch 的性能比 if 的性能高出了约...switch 的秘密 对于 switch 来说,他最终生成的字节码有两种形态,一种是 tableswitch,另一种是 lookupswitch,决定最终生成的代码使用那种形态取决于 switch 的判断添加是否紧凑...总结 switch 的判断条件是 5 个时,性能比 if 高出了约 2.3 倍,而当判断条件的数量越多时,他们的性能相差就越大。...而 switch 在编译为字节码时,会根据 switch 的判断条件是否紧凑生成两种代码:tableswitch(紧凑时生成)和 lookupswitch(非紧凑时生成),其中 tableswitch

    2.2K40
    领券