首页 文章

“else if”是否比“switch()case”更快? [重复]

提问于
浏览
309

可能重复:在C#中使用if / else和switch-case之间是否有任何显着差异?

我是前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;


}

哪一个更快?

我问,因为我的程序有类似的结构(许多很多“其他如果”语句) . 我应该把它们变成开关吗?

14 回答

  • 8

    如果可能, switch 通常由编译器转换为查找表 . 所以查找任意一个案例是O(1),而不是在找到你想要的那个之前实际进行一些案例比较 .

    所以在很多情况下, if / else if 链会变慢 . 但是,根据您的情况被击中的频率,可能没有任何区别 .

  • 519

    简短回答:Switch语句更快

    if语句平均需要两次比较(在运行示例代码时)以获得正确的子句 .

    switch语句的平均比较次数将是1,无论你有多少不同的情况 . 编译器/ VM将在编译时创建可能选项的“查找表” .

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

  • 4

    我说开关是要走的路,它既快又好练 .

    有各种链接,如(http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx),显示比较两者的基准测试 .

  • 5

    我不确定,但我相信一个或另一个的速度会根据您正在使用的编程语言而改变 .

    我通常更喜欢使用开关 . 这样代码就很容易阅读 .

  • 2

    从技术上讲,它们产生完全相同的结果,因此它们应该以几乎相同的方式进行优化 . 但是,编译器有更多机会使用跳转表优化切换表而不是ifs .

    我在这里谈论一般情况 . 对于5个条目,假设您按频率对条件进行排序,则对ifs执行的平均测试次数应小于2.5 . 除非在一个非常紧凑的循环中,否则几乎没有写回家的瓶颈 .

  • 7

    由于 switch 语句表达了与 if / else 链相同的意图,但是以更受限制的,正式的方式,您的第一个猜测应该是编译器能够更好地优化它,因为它可以得出关于条件的更多结论你的代码(即只有一个状态可能是真的,被比较的值是原始类型等等)当你比较两个相似的语言结构以获得运行时性能时,这是一个非常安全的一般事实 .

  • 5

    对于少数项目,差异很小 . 如果你有很多物品,你一定要使用开关 .

    如果一个开关包含五个以上的项目,则使用查找表或哈希列表实现 . 这意味着与if:s列表相比,所有项目都获得相同的访问时间,其中最后一个项目需要更长的时间才能到达,因为它必须首先评估每个先前的条件 .

  • 151

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

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

  • 3

    Switch通常比ifs列表更快,因为编译器可以生成跳转表 . 列表越长,switch语句在一系列if语句中越好 .

  • 12

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

  • 2

    你为什么在乎?

    99.99%的时间,你应该不在乎 .

    这些微优化不太可能影响代码的性能 .

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

    Edit: 为清楚起见's sake: implement whichever design is clearer and more maintainable. Generally when faced with a huge switch-case or if-else block the solution is to use polymorphism. Find the behavior that'正在更改并封装它 . 我've had to deal with huge, ugly switch case code like this before and generally it'并不难以简化 . 但是太令人满意了 .

  • 26

    相信this performance evaluation,开关盒更快 .

    这是结论:

    结果显示switch语句的执行速度比if-else-if梯形图快 . 这是由于编译器能够优化switch语句 . 对于if-else-if梯形图,代码必须按程序员确定的顺序处理每个if语句 . 但是,因为switch语句中的每个case都不依赖于早期的情况,所以编译器能够以提供最快执行的方式重新排序测试 .

  • 5

    比交换机的性能优势更重要(相对较小,但值得注意的是可读性问题 .

    与ifs链相比,我找到了一个非常明确的意图和纯空格的switch语句 .

  • 6

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

相关问题