我是一个前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;


}

哪一个更快?

我之所以这样问,是因为我的程序具有类似的结构(许多许多“else if”语句)。 我应该把它们变成开关吗?


当前回答

如果可能的话,Switch通常会被编译器转换成一个查找表。所以任意情况的查找是O(1)而不是在找到你想要的情况之前做一些情况比较。

所以在很多情况下if/else if链会慢一些。不过,这取决于你的箱子被击中的频率,可能没有什么区别。

其他回答

简单回答:Switch语句更快

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

switch语句的平均比较数将是1不管你有多少不同的情况。编译器/虚拟机将在编译时生成一个可能选项的“查找表”。

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

从技术上讲,它们产生的结果完全相同,因此它们应该以几乎相同的方式进行优化。然而,编译器优化使用跳转表的切换情况的机会比if更大。

我说的是一般情况。对于5个条目,假设您按频率对条件进行排序,则为if执行的平均测试数量应小于2.5。除非是在一个非常紧密的循环中,否则几乎没有瓶颈。

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

我想说转换是正确的方法,它既更快又更好。

下面的链接显示了比较这两者的基准测试。

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