“else if”是否比“switch()case”更快?

时间:2009-04-20 11:07:15

标签: c# performance if-statement switch-statement

  

可能重复:
  Is there any significant difference between using if/else and switch-case in C#?

我是前Pascal人,目前正在学习C#。 我的问题如下:

下面的代码是否比开关更快?

int a = 5;

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

开关:

int a = 5;

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

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;


}

哪一个更快?

我问,因为我的程序有类似的结构(许多很多“其他如果”语句)。 我应该把它们变成开关吗?

14 个答案:

答案 0 :(得分:548)

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

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

答案 1 :(得分:159)

为什么要关心?

<99> 99.99%的时间,你不应该在意。

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

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

编辑:为了清晰起见:实施更清晰,更易于维护的设计。通常,当遇到巨大的switch-case或if-else块时,解决方案是使用多态。找到正在改变并封装它的行为。我之前必须处理这样庞大,丑陋的开关案例代码,而且通常并不难以简化。但是太满意了。

答案 2 :(得分:26)

相信this performance evaluation,切换案例更快。

这是结论:

  

结果显示switch语句的执行速度比if-else-if梯形图快。这是由于编译器能够优化switch语句。对于if-else-if梯形图,代码必须按程序员确定的顺序处理每个if语句。但是,因为switch语句中的每个case都不依赖于早期的情况,所以编译器能够以提供最快执行的方式重新排序测试。

答案 3 :(得分:13)

需要考虑的另一件事是:这真的是您的应用程序的瓶颈吗?在极其罕见的情况下,确实需要优化此类型。大多数情况下,您可以通过重新思考算法和数据结构来获得更好的加速。

答案 4 :(得分:8)

我说切换是要走的路,它既快又好练。

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

答案 5 :(得分:7)

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

答案 6 :(得分:6)

Switch通常比ifs的长列表更快,因为编译器可以生成跳转表。列表越长,switch语句就越好于一系列if语句。

答案 7 :(得分:5)

从技术上讲,它们产生完全相同的结果,因此它们应该以几乎相同的方式进行优化。但是,编译器使用跳转表优化切换表的可能性要大于ifs。

我在这里谈论一般情况。对于5个条目,假设您按频率对条件进行排序,则对ifs执行的平均测试次数应小于2.5。除非在一个非常紧凑的循环中,否则几乎不会成为写回家的瓶颈。

答案 8 :(得分:5)

远比交换机的性能优势(相对较小但值得注意)更重要的是可读性问题。

我发现一个switch语句在intent和纯空格中非常清晰,与ifs链相比。

答案 9 :(得分:5)

我不确定,但我相信一个或另一个的速度会根据您使用的编程语言而改变。

我通常更喜欢使用开关。这样代码就很容易阅读。

答案 10 :(得分:4)

如果可能,

switch通常会被编译器翻译成查找表。因此,查找任意一个案例是O(1),而不是在找到你想要的案例之前实际进行一些案例比较。

因此,在许多情况下,if / else if链会更慢。但是,根据您的案件被击中的频率,这可能没什么区别。

答案 11 :(得分:3)

简答:Switch语句更快

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

switch语句平均比较次数为1,无论你有多少种不同的情况。编译器/ VM将在编译时创建可能选项的“查找表”。

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

答案 12 :(得分:2)

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

答案 13 :(得分:2)

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

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