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

其他回答

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

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

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

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

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

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

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

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