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
分享到:
相关推荐
这是因为`switch-case`在编译时会被优化成查找表或跳转表的形式,而`if-else if-else`则需要逐个条件地进行比较。 2. **比较的值为常量时**: - `switch-case`仅支持常量比较,这意味着它非常适合用于枚举类型的比较...
这些题目展示了Java中的基本逻辑判断和条件语句的运用,包括if-else结构、逻辑运算符(&&, ||)、switch语句以及基本的算术运算。在编写Java代码解决实际问题时,比如练习1-6,我们需要根据条件判断来决定执行不同的...
Java中的switch语句是一种多路分支的选择流程控制结构,它提供了比if-else语句更为简洁的代码形式,尤其在处理多个等值判断...在实际开发中,需要根据具体情况选择使用switch还是if-else,以达到最佳的代码质量和性能。
值得注意的是,if-else和switch语句的选择并不仅仅局限于性能的考虑,还包括代码的可读性和可维护性。在某些情况下,使用switch语句可以让代码更加清晰明了,尤其是在处理具有明确分类或等级制度的场景中。而在需要...
### if与switch的区别 在程序设计中,`if`与`switch`是非常常见的两种选择结构。...综上所述,`if` 和 `switch` 在使用时各有优势和限制。开发者应根据实际需求和上下文来选择最适合的条件判断结构。
随着软件工程的发展和技术的进步,优化`if`语句成为了提高程序性能、减少资源消耗以及提升代码可读性和可维护性的重要手段。本文将深入探讨`if`语句的优化技巧及其应用场景。 #### 一、使用三元运算符简化代码 ...
switch关键字的性能比if-else语句更高,因为它可以使用二分查找和哈希表来提高查找效率。 六、Switch的应用场景 switch关键字广泛应用于各种Java应用程序中,例如: * 根据不同的条件执行不同的代码块 * 实现枚举...
在【例6.1-3】中,展示了如何使用`for`循环创建希尔伯特矩阵,并比较了不同的实现方式对性能的影响。`while`循环则在【例6.1-4】中被用来计算近似欧拉数,直到满足精度要求为止。这些示例不仅展示了循环的基本用法,...
此外,文档还提到了HashMap的遍历方式、switch语句的性能分析、if-else的优雅写法、GC优化、SQL编写建议、MySQL和Redis的性能优化实践等多方面的内容。这些都属于性能优化的重要组成部分。 对于HashMap,了解其遍历...
在某些情况下,switch语句比多层次的if-else结构更为简洁明了。 通过实例,我们看到如何使用这些运算符和语句来解决实际问题,比如找出两个数中的最大值或对输入的两个实数进行排序。理解并熟练运用选择结构是编程...
- PHP中的条件语句主要包括`if`、`if-else`、`if-elseif-else`和`switch`语句。 - `if`语句的基本格式是`if (condition) { // statement(s) }`。 - `if-else`结构允许在条件不成立时执行另一段代码。 - `switch`...
date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间 set 指定环境变量名称=要指派给变量的字符 设置环境变量 set 显示当前所有的环境变量...
5. **Switch与if的比较**:switch通常比多个if-else更简洁,尤其是在处理大量情况时。然而,switch仅适用于有限的类型,如整型、字符型、枚举类型和String(自Java 7开始支持)。 ### 第四章 循环结构(一) 循环...
`if...else` 和 `switch` 语句是两种常见的选择,它们都用于逻辑判断和流程控制。然而,当条件分支变得非常复杂时,这两种方式可能会显得不够优雅或可维护。在本文中,我们将探讨如何使用 `if...else`、`switch` ...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者青睐。在Java的基础学习中,"选择结构"是至关重要的一个部分,它涉及到程序的逻辑控制,使得代码能够根据不同的条件执行不同的...
`switch`语句提供了一种更简洁、更易读的多条件判断方法,相比传统的`if...else if...else`语句,它在处理大量可能的选项时更为高效。 **1. switch语句的基本结构** ```markdown switch(expression) { case value1...
`Switch`是自Android 4.0(API级别14)开始引入的新组件,相比于之前的`ToggleButton`,它提供了更加直观和友好的用户体验。 1. **Switch的基本用法** - `Switch`控件是`ToggleButton`的升级版,继承自`...
JavaScript使用if-else结构,Lua也支持if-then-elseif-else-end结构,但必须以“end”作为结束标记。 7. Switch语句差异 Lua不支持switch语句,而JavaScript中可以使用switch结构来处理多条件分支。 8. 消息框差异...
switch语句则提供了一种多条件分支的选择结构,可以替代多个if-else if-else块。 函数在JavaScript中扮演着核心角色。函数不仅可以作为值传递,还可以用作对象的属性。arguments对象在函数内部提供了一个方便的方式...