关于c:是”else if”快于”switch()case”?

Is “else if” faster than “switch() case”?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Is there any significant difference between using if/else and switch-case in C#?

我以前是帕斯卡人,现在在学C。我的问题是:

下面的代码是否比进行切换更快?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int a = 5;

if (a == 1)
{
    ....
}
else if(a == 2)
{
    ....
}
else if(a == 3)
{
    ....
}
else if(a == 4)
{
    ....
}
else
    ....

开关:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int a = 5;

switch(a)
{
    case 1:
        ...
        break;

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;


}

哪个更快?

我问,因为我的程序有一个类似的结构(许多,许多"else if"语句)。我应该把它们变成开关吗?


对于少数项目,差异很小。如果你有很多东西,你一定要用开关。

如果一个开关包含五个以上的项,则使用查找表或哈希列表来实现。这意味着与一个if:s列表相比,所有项目都获得相同的访问时间,其中最后一个项目需要花费更多的时间来访问,因为它必须首先评估每个以前的条件。


你为什么在乎?

99.99%的时候,你不应该在意。

这些微优化不太可能影响代码的性能。

另外,如果需要注意,那么应该对代码进行性能分析。在这种情况下,找出开关盒和if-else块之间的性能差异是微不足道的。

编辑:为了清晰起见:实现任何更清晰和更可维护的设计。一般来说,当面对一个巨大的开关盒或如果其他阻塞的解决方案是使用多态性。找到正在改变的行为并将其封装。我以前必须处理像这样巨大的、丑陋的交换代码,一般来说,简化并不那么困难。但是,哦,太令人满意了。


相信这种性能评估,交换机的情况会更快。

结论如下:

The results show that the switch statement is faster to execute than the if-else-if ladder. This is due to the compiler's ability to optimise the switch statement. In the case of the if-else-if ladder, the code must process each if statement in the order determined by the programmer. However, because each case within a switch statement does not rely on earlier cases, the compiler is able to re-order the testing in such a way as to provide the fastest execution.


另一个需要考虑的问题是:这真的是应用程序的瓶颈吗?当确实需要对这类进行优化时,有非常罕见的情况。大多数时候,你可以通过重新考虑你的算法和数据结构来获得更好的加速。


我想说的是转换是一种方式,它既快又好。

有各种各样的链接,例如(http://www.blackwasp.co.uk/speedtestifelswitch.aspx),显示比较这两者的基准测试。


不应该很难测试,创建一个在5个数字之间切换或ifelse的函数,向该函数中抛出一个rand(1,5),并在计时时循环几次。


由于编译器可以生成一个跳转表,因此切换通常比一长串IFS更快。列表越长,switch语句优于一系列if语句。


我不确定,但我相信一种或其他的速度会根据您使用的编程语言而变化。

我通常喜欢用开关。这样,代码就很容易读取。


比交换机的性能优势(虽然相对轻微,但值得注意)更重要的是可读性问题。

我个人认为交换语句在意图和纯空白方面非常清楚,与IFS链相比。


从技术上讲,它们产生的结果完全相同,因此它们应该可以以几乎相同的方式进行优化。但是,与IFS相比,编译器使用跳转表优化开关案例的可能性更大。

我说的是一般情况。对于5个条目,假设您按频率排序条件,则为国际单项体育联合会执行的平均测试数应小于2.5。除非是在一个非常紧密的循环中,否则很难成为写回家的瓶颈。


如果可能,编译器通常会将switch翻译成查找表。因此,查找任意案例是O(1),而不是在找到所需案例之前进行一些案例比较。

因此,在许多情况下,ifelse if链会变慢。不过,这取决于你的案件被击中的频率,这可能没有什么区别。


简短回答:switch语句更快

if语句平均需要两个比较(在运行示例代码时)才能得到正确的子句。

switch语句的平均比较数将是一个,不管您有多少不同的情况。编译器/VM将在编译时为可能的选项创建一个"查阅表"。

如果经常运行此代码,虚拟机能否以类似的方式优化if语句?


看见http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28vs.71%29.aspx

switch语句基本上是一个查找表,它具有已知的选项和if语句类似于布尔类型。根据我的开关,如果其他相同,但逻辑开关可以帮助更好。如果还有其他的帮助,在阅读中也能理解。


由于switch语句表达的意图与if/else链相同,但以更严格、更正式的方式,您的第一个猜测应该是编译器将能够更好地优化它,因为它可以得出更多关于您的代码条件的结论(即只有一种状态可能是真的,即正在比较的值是一个基元类型等)当您比较两个类似的语言结构以获得运行时性能时,这是一个非常安全的一般事实。