我是一个前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的性能优势(相对来说微不足道,但值得注意)更重要的是可读性问题。

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

其他回答

你为什么关心这个?

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

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

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

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

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

我不确定,但我相信其中一个的速度取决于你使用的编程语言。

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

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

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

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