如何优化switch语句

编程的过程中难免会使用到switch语句,case如果少的情况下,效率和性能还可以,如果出项比较多的case的情况下,
还使用swtich,将会大大影响程序的性能。如何优化这样比较大的switch语句呢?有三种方法:
第一种方法就是根据频率来排列case的位置,对于频率较高的case放到前面,而不是按照
case的值得有序排列,例如:
  switch (type)
  {
   case 1:
    break;
   case 2:
    break;
   …
   case 20:
    break;
   default:
    break;
  }
 假设18,和19地使用频率最高,则修改为
  switch (type)
  {
   case 18:
    break;
   case 19:
    break;
   case 1:
    break;
   case 2:
    break;
   …
   case 20:
    break;
   default:
    break;
  }
这种方法只使用于一些case语句不多的情况,如果case语句很多,最好还是采用后面两种方法。


第二种方法就是使用嵌套的switch,将原来的线性判断,修改二级树的形式判断,例子如下
  switch (type)
  {
   case 1:
    break;
   case 2:
    break;
   …
   case 100:
    break;
   …
   case 200:
    break;
   default:
    break;
  }
修改为:
if (1< type  && type <50)
 {
 switch (type)
 {
  case 1: This case is used most. And the frequency descends one bye one.
   break;
  case 2:
   break;
  …
  case 49:
   break;
  default:
   break;
 }; // This may be encapsulated as a function.
} else if (51< m_pdutype  && m_pdutype <99)
{
 switch (type)
 {
  case 51: This case is used most. And the frequency descends one bye one.
   break;
  case 52:
   break;
  …
  case 99:
   break;
  default:
   break;
 }; // This may be encapsulated as a function.
} else if ()
{
 …
}




这样就可以减少判断地次数, 从而提高效率, 并且在每一个switch中需要将频率使用比较高的case放到前面。


第三种方法,如果case的值是有序递增或者有一定规律的,就可以使用函数数组:
例如:可以抽象出所有的case处理函数需要的参数,这里简单的以一个整形参数为例,建设函数
可以抽象为:
int handleCase1(void);
int handleCase2(void);
int handleCase3(void);
int handleCase4(void);


typedef void (*handleCaseFunc)(void) ;
handleCaseFunc   g_apFuncArray[200]
={
 handleCase1,
 handleCase2,
 handleCase3,
 ...
 handleCase199
};


根据这种方法,可以把一下的switch语句:
  switch (type)
  {
   case 1:
    break;
   case 2:
    break;
   …
   case 100:
    break;
   …
   case 200:
    break;
   default:
    break;
  }
可以修改为:
 g_apFuncArray[(type)-1](type);
 
是不是很简单呢?


不过这种方法也有一个缺点,就是初始化数组要细心, 如果函数的位置搞错了,可就麻烦了。
当然,如果type的值很分散,没有规律可以找,例如:1,5,13,29, 57...就不太适合使用
函数数组。实在想使用的话就只有修改设计了,将type的值修改的有规例。


我在优化switch的过程中遇到过type的值是有两段的,第一段是1~109, 第二段是10001~10031,
我就编写了一个宏实现从type值到函数数组索引得转换
#define GET_YPE_INDEX(type)   (type) < 10000 ? (type): (type)-9850;


之所以减9850是预留109~150以防备将来扩展使用。


当然如果是2,4,6,8这样的可以通过type/2来获得等等。


总之,编写switch语句要十分小心,如果在关键的代码路径里使用更要主要考虑case的多少对性能
的影响。希望本文对你有一定的帮助。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
switch语句的耗时情况取决于case的数量和输入表达式的值。一般而言,switch语句的时间复杂度为O(1),因为在执行switch语句时,它会直接跳转到对应的case执行相应的代码,而不需要遍历case语句。然而,如果case的数量较多,时间复杂度可能会退化到O(n),因为在这种情况下,switch语句需要逐个检查每个case,直到找到匹配的case或执行default语句。 另外,如果开启了编译优化选项-O,编译器可能会使用二分查找的方式来优化switch语句,以提高执行效率。这种优化可以降低switch语句的时间复杂度,并加快查找过程。 总结来说,switch语句的耗时情况取决于case的数量、输入表达式的值以及编译器的优化方式。在一般情况下,switch语句的时间复杂度为O(1),但当case的数量较多时,可能会退化到O(n)。而通过编译器的优化,可以进一步提高switch语句的执行效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python 为什么不支持 switch 语句?](https://blog.csdn.net/u010467643/article/details/108988930)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C/C++中的switch语句优化效率的两种方式](https://blog.csdn.net/qq_36622751/article/details/124949627)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值