Iva*_*nov 344 c# performance if-statement switch-statement
我是前Pascal人,目前正在学习C#.我的问题如下:
下面的代码比开关更快吗?
int a = 5;
if (a == 1)
{
....
}
else if(a == 2)
{
....
}
else if(a == 3)
{
....
}
else if(a == 4)
{
....
}
else
....
Run Code Online (Sandbox Code Playgroud)
和开关:
int a = 5;
switch(a)
{
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
case 4:
...
break;
default:
...
break;
}
Run Code Online (Sandbox Code Playgroud)
哪一个更快?
我问,因为我的程序有类似的结构(许多很多"其他如果"语句).我应该把它们变成开关吗?
Guf*_*ffa 578
对于少数项目,差异很小.如果你有很多物品,你一定要使用开关.
如果一个开关包含五个以上的项目,则使用查找表或哈希列表实现.这意味着与if:s列表相比,所有项目都获得相同的访问时间,其中最后一个项目需要更长的时间才能到达,因为它必须首先评估每个先前的条件.
Wed*_*dge 168
你为什么在乎?
99.99%的时间,你应该不在乎.
这些微优化不太可能影响代码的性能.
此外,如果您需要关心,那么您应该对代码进行性能分析.在这种情况下,找出switch case和if-else块之间的性能差异将是微不足道的.
编辑:为了清楚起见:实现更清晰,更易于维护的设计.通常,当遇到巨大的switch-case或if-else块时,解决方案是使用多态.找到正在改变并封装它的行为.我之前必须处理这样庞大,丑陋的开关案例代码,而且通常并不难以简化.但是哦太满意了.
Switch通常比ifs列表更快,因为编译器可以生成跳转表.列表越长,switch语句在一系列if语句中越好.
从技术上讲,它们产生完全相同的结果,因此它们应该以几乎相同的方式进行优化.但是,编译器有更多机会使用跳转表优化切换表而不是ifs.
我在这里谈论一般情况.对于5个条目,假设您按频率对条件进行排序,则对ifs执行的平均测试次数应小于2.5.除非在一个非常紧凑的循环中,否则几乎不会成为写回家的瓶颈.
switch
如果可能的话,通常会被编译器翻译成一个查找表。因此,查找任意案例是 O(1),而不是在找到您想要的案例之前实际进行一些案例比较。
所以在很多情况下if
/else if
链会更慢。不过,根据您的案件被击中的频率,可能没有任何区别。
小智 5
我不确定,但我相信一个或另一个的速度会根据您使用的编程语言而改变.
我通常更喜欢使用开关.这样代码就很容易阅读.
归档时间: |
|
查看次数: |
336598 次 |
最近记录: |