为什么开声明并不如其他的吗?
-
19-08-2019 - |
解决方案
一个 开关 建造更容易翻译成 跳(或分支机构)表.这可以使交换的发言高效得多 如果-其他 当情况下标签靠在一起。这个想法是要将一群跳说明按顺序内存在,然后添加价值的程序计数器。这将替换序列的比较说明与一个附加的操作。
下面是一些极其简单伪装的例子。第一,如果其他版本:
// 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-你会得到更快的代码。
此外,我发现它是多优雅的当处理可枚举的类型。
总的来 开关 发言给你 性能 + 代码优雅 :)
这里有一些有用的链接:
- 速度比较的开关vs如果/其他C#
- 反馈导开声明 优化 (pdf描述开声明,优化)
对于表现力、开关/情况下的发言可以让你组多情况下在一起,例如:
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