哪一个更快?
我问,因为我的程序有类似的结构(许多很多“其他如果”语句)。我应该把它们变成开关吗?
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
我说开关是要走的路,它既快又好练。
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也有助于在阅读中理解。