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`结构,`switch-case`可以使代码更清晰、可读性更强。当有多个独立的、不连续的值需要进行判断时,`switch-case`是更好的选择...
与if-else相比,switch语句提供了一种更简洁的方式来处理多个可能的情况。在第二个任务中,计算三个整数a、b、c中的最大数,虽然可以使用if-else实现,但更适合使用switch。switch语句基于表达式的值来选择执行的...
与if-else语句相比,switch的主要优势在于结构清晰,易于阅读,特别是当有很多可能的分支时。然而,if-else可以处理任何类型的比较,并且可以在条件更复杂的情况下提供更大的灵活性。例如,if-else可以处理范围比较...
但是,很多开发者不知道如何选择使用 switch 或 if,以至于代码的效率和可读性受到影响。在本文中,我们将详细比较 switch 与 if 的效率差异,并讨论何时使用 switch 何时使用 if。 首先,让我们来看看 switch 语句...
作业则是要求学生用if-else if-else和switch语句实现相同的功能,以巩固对两种多分支语句的理解。 总的来说,这堂课旨在通过理论讲解和实践操作,使学生深入了解Java的运算符和分支语句,为后续的Java编程打下坚实...
与`if-else`相比,`switch-case`在某些情况下可以提供更清晰的代码结构,尤其是在处理多个等价条件时。此外,JavaScript的三目运算符(`condition ? expressionIfTrue : expressionIfFalse`)则是另一种简洁的条件...
C++中的`switch`语句是一种条件控制结构,它提供了多路选择的执行路径,用于替代一系列的`if...else if...else`语句。在`switch`语句中,根据给定变量的不同值,程序将执行相应的代码块。下面我们将深入探讨`switch`...
相比于连续的`IF-ELSE IF-ELSE`语句,`SWITCH`通常提供了一种更简洁、更易于阅读的方式来处理多个条件的情况。 #### `SWITCH`语法 `SWITCH`语句的一般形式如下: ```vb SWITCH(expression) { CASE value1: ' 当...
- 与多个`if-else`语句相比,`switch`语句更简洁且易于理解。 #### 循环结构 - **1.10 循环结构(while、do…while、for)** - **1.10.1 什么是循环结构** - 循环结构用于重复执行一段代码直到满足某个条件。 - ...
相比于传统的 `if-elseif-else` 结构,`switch` 语句提供了更为简洁和易读的解决方案,尤其适用于处理具有多个可能取值的情况。 #### 基本语法 `switch` 语句的基本语法结构如下: ```java switch (表达式) { ...
与if-else相比,switch-case在处理多条件分支时更为简洁。 然后,我们将学习循环语句的变体,如do-while循环,它至少会执行一次循环体,然后根据条件决定是否继续。此外,还有for-each循环,专门用于遍历集合或数组...
相比一系列的`if-elseif-else`,`switch`语句更简洁,更易于阅读和维护。每个`case`后的值是进行比较的变量,`break`语句用于退出`switch`结构。 循环语句是程序设计中的重要组成部分,包括`for`循环、`while`循环...
与if-else语句相比,switch语句在处理多个分支时更为简洁明了。 2. **switch语句的语法** 在大多数支持switch语句的编程语言(如C、C++、Java、C#等)中,其基本语法如下: ```markdown switch(expression) { ...
相比if-else结构,switch语句能够简化代码,提高可读性和可维护性,尤其是在处理大量条件分支时。 例如,考虑以下两种情况: ##### 使用多重if语句: ```c if (x == 1) { printf("x is equal to one.\n"); } ...
`switch` 相比 `if...else` 在结构上更清晰,但同样适用于简单的值匹配,如果需要复杂的逻辑判断,它可能就不够用了。 3. **基于对象的哈希方法**: 这种方法利用 JavaScript 对象的键值对特性,将条件作为键,...
选择语句(switch)提供了一种更简洁的多条件分支方式,相比于多个if-else if语句,switch在处理多选项的判断时更加清晰。例如,根据用户输入的数字来执行不同的操作,比如1代表“加法”,2代表“减法”等。 在学习...
判断语句,如`if`和`else`,用于根据特定条件执行代码块。例如,`if`语句用于检查条件,如果条件为真,则执行紧跟的代码块。如果需要在条件不成立时执行另一段代码,可以使用`else`语句。此外,`if-else if-else`...
switch语句提供了一种更简洁的方式来处理多个可能的分支,相比于多个if-else if-else语句链,它的可读性和效率通常更高。 ```c switch(ch) { case 'A': printf("80-100\n"); break; case 'B': printf("70-79...
`Switch`是自Android 4.0(API级别14)开始引入的新组件,相比于之前的`ToggleButton`,它提供了更加直观和友好的用户体验。 1. **Switch的基本用法** - `Switch`控件是`ToggleButton`的升级版,继承自`...
与if-else if-else语句相比,switch通常在处理多个可能的选项时更为简洁。switch语句的基本语法结构如下: ```java switch (expression) { case value1: // code to be executed if expression matches value1 ...