首页 文章

为什么switch语句而不是if-else?

提问于
浏览
58

我到目前为止还不是一个核心程序员,主要是小型Python脚本,我写了几个分子动力学模拟 . 对于真正的问题:switch语句有什么意义?你为什么不能只使用if-else语句?

感谢您的回答,如果之前有人询问过,请指向我的链接 .

EDIT

S.Lott指出,这可能是问题的重复If/Else vs. Switch . 如果你想关闭然后这样做 . 我将把它留待进一步讨论 .

8 回答

  • 22

    switch结构更容易转换为jump (or branch) table . 当case标签靠近时,这可以使switch语句比if-else更有效 . 我们的想法是在内存中依次放置一堆跳转指令,然后将值添加到程序计数器中 . 这将使用添加操作替换一系列比较指令 .

    下面是一些非常简化的伪装配示例 . 首先,if-else版本:

    // C version
        if (1 == value)
            function1();
        else if (2 == value)
            function2();
        else if (3 == value)
            function3();
    
        // assembly version
        compare value, 1
        jump if zero label1
        compare value, 2
        jump if zero label2
        compare value, 3
        jump if zero label3
    label1:
        call function1
    label2:
        call function2
    label3:
        call function3
    

    接下来是交换机版本:

    // C version
        switch (value) {
        case 1: function1(); break;
        case 2: function2(); break;
        case 3: function3(); break;
        }
    
        // assembly version
        add program_counter, value
        call function1
        call function2
        call function3
    

    您可以看到生成的汇编代码更紧凑 . 请注意,需要以某种方式转换该值以处理除1,2和3之外的其他值 . 但是,这应该说明这个概念 .

  • 1

    切换可以是optimized by compile r - 您将获得更快的代码 .
    在处理可枚举类型时,我发现它更优雅 .

    总结一下switch语句给你 performance code elegance :)

    以下是一些有用的链接:

  • 87

    为表达性,switch / case语句允许您将多个案例组合在一起,例如:

    case 1,2,3: do(this); break;
    case 4,5,6: do(that); break;
    

    为了提高性能,编译器有时可以将switch语句优化为跳转表 .

  • 6

    我忽略了这种低级优化通常不重要,可能与编译器不同 .

    我要说的主要区别在于可读性 . if / else非常灵活,但是当你看到一个开关时,你就知道所有的测试都是针对同一个表达式的 .

  • 2

    除了在.NET中提到的其他代码可读性和优化之外,您还可以打开枚举等功能

    enum Color { Red, Green, Blue }; 
    
    Color c = Color.Red;
    
    switch (c) // Switch on the enum
    
    {
    
    // no casting and no need to understand what int value it is
    
    case Color.Red:    break;
    case Color.Green:  break;
    case Color.Blue:   break;
    
    }
    
  • 6

    通过几个案例(故意遗漏休息声明)的能力可能是有用的,并且正如一些人已经说过它也更快 . 也许最重要也是最不重要的考虑因素是,它只是制作比if / else更漂亮的代码 . :)

  • 3

    某些编译器可以优化开关"Better" . 在某些语言中使用switch语句存在缺陷 . 在Java中,交换机无法处理字符串,在VB2005中,switch语句不能用于单选按钮 .
    Switch可以更快,更容易阅读,If-Then更通用,可以在更多地方使用 .

  • -1

    唯一的时间切换可以更快,当您的案例值是常量,而不是动态或以其他方式派生时,并且当案例数明显大于计算哈希到查找表中的时间 .

    在大多数引擎(包括Chrome的V8引擎)上编译执行程序集的Javascript的例子是,在常见情况下执行开关语句的速度要慢30%-60%:http://jsperf.com/switch-if-else/20

相关问题