我一直在想这现在一段时间。我是远远不是一个铁杆的程序,主要是蟒蛇小脚本我写了几分子动力学模拟。真正的问题:要点是什么的 换句?为什么你就不能使用 如果其他发言?

谢谢你的回答,如果这已经要求之前,请点我的链接。

编辑

S.洛特 有人指出,这可能是重复的问题 如果/其他与开关.如果你想要靠近然后这样做。我会把它打开进一步讨论。

有帮助吗?

解决方案

一个 开关 建造更容易翻译成 跳(或分支机构)表.这可以使交换的发言高效得多 如果-其他 当情况下标签靠在一起。这个想法是要将一群跳说明按顺序内存在,然后添加价值的程序计数器。这将替换序列的比较说明与一个附加的操作。

下面是一些极其简单伪装的例子。第一,如果其他版本:

    // 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。然而,这应该说明概念。

其他提示

开关可以 通过优化汇编r-你会得到更快的代码。
此外,我发现它是多优雅的当处理可枚举的类型。

总的来 开关 发言给你 性能 + 代码优雅 :)

这里有一些有用的链接:

对于表现力、开关/情况下的发言可以让你组多情况下在一起,例如:

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

对性能,编纂者有时可以优化开关声明进入跳跃表。

我忽略了这种类型的低级优化作为通常并不重要,而且可能不同于编译器,来编译器。

我想说的主要差别是可读性。如果/其他非常灵活,但是当你看到一个开关,你知道,所有的测试都是针对相同的表达。

除了其他提到码的可读性和优化。净你还可以获得的能力开关在枚举的等等

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;

}

能够通过几种情况(故意留下的断言)可能是有用的,因为一些人已经说过它的速度更快。也许最重要和最重要的考虑是,它只是使得更漂亮的码比如/人。:)

开关可以最优化"更好"的一些编译器。有陷阱,与使用开关声明在某些语言。在Java,开无法处理串并在VB2005开关声明不会的工作与无线电按钮。
开关可以更快和更容易阅读,如果-那是更多的通用的,并将在更多的地方。

唯一的开关时间可以更快的是当你的情况值数、不动态或其衍生的,而当的案件数量显着大于时间来计算的散列入一个查找表。

例Javascript,其中汇编了以大会为执行大多数引擎,包括铬的V8发动机,是关声明是30%-60%的速度执行中的常见情况下: http://jsperf.com/switch-if-else/20

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top