我是一个前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语句更快

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

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

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

其他回答

就少数几项而言,差别很小。如果你有很多东西,你一定要用开关。

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

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

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

比switch的性能优势(相对来说微不足道,但值得注意)更重要的是可读性问题。

就我个人而言,我发现switch语句的意图和纯空白非常清楚,与if链相比。

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

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

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