我是一个前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 / else链一样的意图但更受限制的,正式的方式,你的第一个猜测应该是编译器将能够优化它更好,因为它可以吸引更多的结论的条件放在您的代码(即只有一个国家可能是真的,价值相比是一个原始类型,等等),这是一个相当安全的一般真理,当你比较两个相似的语言结构的运行时性能。

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

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

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

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

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

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