http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 4534|回复: 1

[C#语言基础] c# “else if”比“switch()case”快吗?

[复制链接]
发表于 2021-10-23 15:33:20 | 显示全部楼层 |阅读模式
可能重复:
在C#中使用if / else和switch-case之间是否有任何显着差异?
我是前Pascal人,目前正在学习C#。我的问题如下:
下面的代码比开关更快吗?

[C#] 纯文本查看 复制代码
int a = 5;

if (a == 1)
{
    ....
}
else if(a == 2)
{
    ....
}
else if(a == 3)
{
    ....
}
else if(a == 4)
{
    ....
}
else
    ....

[C#] 纯文本查看 复制代码
int a = 5;

switch(a)
{
    case 1:
        ...
        break;

    case 2:
        ...
        break;

    case 3:
        ...
        break;

    case 4:
        ...
        break;

    default:
        ...
        break;


}

哪一个更快?

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

performance c# if-statement switch-statementIvan Prodanov asked 2019-02-02T09:18:41Z
14个解决方案
519 votes
对于少数项目,差异很小。 如果你有很多物品,你一定要使用开关。

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

Guffa answered 2019-02-02T09:18:55Z
151 votes
你为什么在乎?

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

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

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

编辑:为了清楚起见:实现更清晰,更易于维护的设计。 通常,当遇到巨大的switch-case或if-else块时,解决方案是使用多态。 找到正在改变并封装它的行为。 我之前必须处理这样庞大,丑陋的开关案例代码,而且通常并不难以简化。 但是哦太满意了。

Wedge answered 2019-02-02T09:19:43Z
26 votes
相信这种性能评估,开关盒更快。

这是结论:

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

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

Vilx- answered 2019-02-02T09:20:40Z
8 votes
我说开关是要走的路,它既快又好练。

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

Shaun Bohannon answered 2019-02-02T09:21:09Z
7 votes
不应该很难测试,创建一个在5个数字之间切换或ifelse的函数,将rand(1,5)抛入该函数并在计时时循环几次。

ólafur Waage answered 2019-02-02T09:21:31Z
6 votes
Switch通常比ifs列表更快,因为编译器可以生成跳转表。 列表越长,switch语句在一系列if语句中越好。

Steven answered 2019-02-02T09:21:53Z
5 votes
从技术上讲,它们产生完全相同的结果,因此它们应该以几乎相同的方式进行优化。 但是,编译器有更多机会使用跳转表优化切换表而不是ifs。

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

jfclavette answered 2019-02-02T09:22:22Z
5 votes
更重要的是交换机的性能优势(相对较小,但值得注意)是可读性问题。

我发现一个switch语句在intent和纯空格中非常清晰,与ifs链相比。

annakata answered 2019-02-02T09:22:51Z
5 votes
我不确定,但我相信一个或另一个的速度会根据您使用的编程语言而改变。

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

user308693 answered 2019-02-02T09:23:26Z
4 votes
if通常由编译器转换为查找表,如果可能的话。 所以查找任意一个案例是O(1),而不是在找到你想要的那个之前实际进行一些案例比较。

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

Joey answered 2019-02-02T09:23:56Z
3 votes
简短的回答:Switch语句更快

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

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

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

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

mquander answered 2019-02-02T09:25:06Z
2 votes

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



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2021-10-23 19:24:08 | 显示全部楼层
我这边有一个java大型网游模拟器,很多大神都会把if else 改为switch case
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-16 04:19

© 2014-2021

快速回复 返回顶部 返回列表