`
x___man
  • 浏览: 2561 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

if else 与switch 性能比较

阅读更多
switch可以进行跳转优化,java中对switch有两种处理方式,生成不同的jvm指令,一是tableswitch,一个是lookupswitch.
对于case的分支比较密集的情况,如

Java code

public class Test {

    public static void main(String[] args) {
        int i = 3;
        switch (i) {
            case 0:
                System.out.println("0");
                break;
            case 1:
                System.out.println("1");
                break;
            case 3:
                System.out.println("3");
                break;
            case 5:
                System.out.println("5");
                break;
            case 10:
                System.out.println("10");
                break;
            case 13:
                System.out.println("13");
                break;
            case 14:
                System.out.println("14");
                break;
        default:
        System.out.println("default");
                break;
        }


    }
}

使用tableswitch,得到

Java code

public static void main(java.lang.String[]);
  Code:
   0:    iconst_3
   1:    istore_1
   2:    iload_1
   3:    tableswitch{ //0 to 14
        0: 76;
        1: 87;
        2: 153;
        3: 98;
        4: 153;
        5: 109;
        6: 153;
        7: 153;
        8: 153;
        9: 153;
        10: 120;
        11: 153;
        12: 153;
        13: 131;
        14: 142;
        default: 153 }
   76:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   79:    ldc    #3; //String 0
   81:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   84:    goto    161
   87:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   90:    ldc    #5; //String 1
   92:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   95:    goto    161
   98:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   101:    ldc    #6; //String 3
   103:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   106:    goto    161
   109:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   112:    ldc    #7; //String 5
   114:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   117:    goto    161
   120:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   123:    ldc    #8; //String 10
   125:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   128:    goto    161
   131:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   134:    ldc    #9; //String 13
   136:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   139:    goto    161
   142:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   145:    ldc    #10; //String 14
   147:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   150:    goto    161
   153:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   156:    ldc    #11; //String default
   158:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   161:    return

}

从中可以看到tableswitch使用的跳转表。它这样查找,如果case值不在//0 to 14之间,直接执行default,如果在此范围之内,则取目标值-0这一项作为目标,比如switch(i),i为3,则跳转到3-0=3,使用数组中的第三项作为目标,也就是3: 98;直接去执行98行。

如果case中的值比较稀疏,则使用lookupswitch:

Java code

public class Test2 {

    public static void main(String[] args) {
        int i = 3;
        switch (i) {
            case 3:
                System.out.println("3");
                break;
            case 20:
                System.out.println("20");
                break;
            case 50:
                System.out.println("50");
                break;
            case 100:
                System.out.println("100");
                break;
        }


    }
}

编译为

Java code
?

public static void main(java.lang.String[]);
  Code:
   0:    iconst_3
   1:    istore_1
   2:    iload_1
   3:    lookupswitch{ //4
        3: 44;
        20: 55;
        50: 66;
        100: 77;
        default: 85 }
   44:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   47:    ldc    #3; //String 3
   49:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   52:    goto    85
   55:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   58:    ldc    #5; //String 20
   60:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   63:    goto    85
   66:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   69:    ldc    #6; //String 50
   71:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   74:    goto    85
   77:    getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   80:    ldc    #7; //String 100
   82:    invokevirtual    #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   85:    return

可以看到其中的
3: lookupswitch{ //4
3: 44;
20: 55;
50: 66;
100: 77;
default: 85 }
分享到:
评论

相关推荐

    if跟switch的区别

    ### if与switch的区别 在程序设计中,`if`与`switch`是非常常见的两种选择结构。它们用于根据不同的条件执行不同的代码块。虽然两者都可以实现条件判断的功能,但它们之间存在一些重要的区别。 #### `if` 语句 `...

    JavaScript中if与case比较

    在大多数情况下,`switch-case`结构与多个`if-else`结构的性能差异并不显著。然而,在某些特定情况下,`switch-case`可能表现得更好: 1. **条件分支数量较多时**: - 当条件分支数量超过6个左右时,`switch-case`...

    php中switch与ifelse的效率区别及适用情况分析

    值得注意的是,if-else和switch语句的选择并不仅仅局限于性能的考虑,还包括代码的可读性和可维护性。在某些情况下,使用switch语句可以让代码更加清晰明了,尤其是在处理具有明确分类或等级制度的场景中。而在需要...

    Java逻辑基础题2-if和switch答案.docx

    可以使用if-else或switch语句来处理不同税率段的情况。 练习7:奖金提成计算涉及到多个提成比例,需要根据利润范围选择合适的提成率。这通常使用嵌套的if-else结构完成。 以上就是Java逻辑基础题中涉及的知识点,...

    if语句的优化

    随着软件工程的发展和技术的进步,优化`if`语句成为了提高程序性能、减少资源消耗以及提升代码可读性和可维护性的重要手段。本文将深入探讨`if`语句的优化技巧及其应用场景。 #### 一、使用三元运算符简化代码 ...

    swtich/if…else的替代语句

    `if...else` 和 `switch` 语句是两种常见的选择,它们都用于逻辑判断和流程控制。然而,当条件分支变得非常复杂时,这两种方式可能会显得不够优雅或可维护。在本文中,我们将探讨如何使用 `if...else`、`switch` ...

    3.3 用switch实现选择结构(ppt).zip

    `switch`语句提供了一种更简洁、更易读的多条件判断方法,相比传统的`if...else if...else`语句,它在处理大量可能的选项时更为高效。 **1. switch语句的基本结构** ```markdown switch(expression) { case value1...

    java学习资料-switch基础介绍及具体使用方法

    Java中的switch语句是一种多路分支的选择流程控制结构,它提供了比if-else语句更为简洁的代码形式,尤其在处理多个等值判断...在实际开发中,需要根据具体情况选择使用switch还是if-else,以达到最佳的代码质量和性能。

    用开源项目实现自定义switch

    - **外观设计**:你可以改变Switch的滑块颜色、背景色、文字颜色、大小等,使其与应用的整体风格保持一致。 - **动画效果**:添加平滑的过渡动画,使开关状态切换时更加自然。 - **交互行为**:调整开关的触摸...

    android switch 开关按钮

    在Android开发中,`Switch`控件是一种非常常见的交互元素,尤其在设置界面或选项配置中经常被使用。它在视觉上模拟了现实世界中的开关,用户可以通过滑动来开启或关闭某项功能。`Switch`是自Android 4.0(API级别14...

    javascript中if和switch,==和===详解

    在性能方面,通常情况下,`switch` 比一系列的 `if...else if...else` 语句更快,因为它只需要找到匹配的 `case` 而不需要逐个测试。然而,对于复杂的逻辑,`if` 可能更易读且更灵活。在优化代码时,应根据实际情况...

    在ListView中嵌套Switch开关,点击ListView条目来切换Switch的状态

    在Android开发中,...注意,为了优化性能,通常会使用ViewHolder模式来避免频繁地查找视图,同时在`getView()`中适当地复用convertView。此外,如果数据源较大,考虑使用异步加载或分页加载技术来提高用户体验。

    条件执行的本质

    在Java等编程语言中,条件执行的实现依赖于条件语句,如if、else和switch等。理解这些语句的工作原理,对于编写高效和可读性高的代码至关重要。 首先,让我们看看if语句。if语句是最基础的条件执行结构,它允许程序...

    android4.0switch源码

    通过研究`android4.0 switch`源码,开发者不仅可以理解`Switch`的基本工作原理,还能学习到如何进行UI组件的自定义和性能优化,这对于提升Android应用的用户体验至关重要。在`SwitchDemo`项目中,开发者可以找到实际...

    Java switch关键字原理及用法详解

    在这篇文章中,我们将深入探讨Java switch关键字的原理和用法,并探讨其与if-else语句的区别。 一、Switch语法 switch语法的基本结构如下所示: ``` switch (exp) { case exp1: // 代码块 break; case exp2: ...

    7enum和switch语句联合案例分析VC共6页.pdf

    与多个`if...else if...else`语句相比,`switch`通常更简洁、高效: ```cpp switch (color) { case Red: // 处理红色 break; case Green: // 处理绿色 break; case Blue: // 处理蓝色 break; default: /...

    TestSwitch

    5. **优化与性能**:`switch`语句通常比一系列的`if...else if...else`语句运行得更快,因为编译器能够对`switch`进行优化,创建一个查找表来提高执行速度。 6. **异常处理**:在`switch`结构中,错误的`case`标签...

    第02章 Java编程基础 11 Switch分支语句

    在Java中,Switch语句通常用于替代多个if...else if...else结构,尤其当有多个可能的选项时,Switch的可读性和效率优势更加明显。 Switch语句的基本语法如下: ```java switch (expression) { case value1: // ...

Global site tag (gtag.js) - Google Analytics