我是一个前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”语句)。 我应该把它们变成开关吗?


当前回答

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

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

其他回答

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

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

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

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

你为什么关心这个?

99.99%的情况下,你不应该在意。

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

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

编辑:为了清晰起见:实现任何更清晰和更可维护的设计。通常,当面对一个巨大的开关情况或if-else块时,解决方案是使用多态性。找到正在变化的行为并将其封装。我曾经处理过像这样巨大而丑陋的开关case代码,一般来说,简化它并不难。但是,太令人满意了。

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

相信这个性能评估,切换的情况是更快的。

结论如下:

结果表明,switch语句比if-else-if阶梯语句执行得更快。这是由于编译器优化switch语句的能力。在if-else-if阶梯的情况下,代码必须按照程序员确定的顺序处理每个if语句。但是,由于switch语句中的每个用例都不依赖于之前的用例,因此编译器能够以提供最快执行的方式重新排序测试。