如何优化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来获得等等。
分享到:
相关推荐
C语言switch语句学习教案.pptx
switch语句 switch 语句 与 if-then 和 if-then-else 语句不同,switch 语句可以具有许多可能的执行路径。switch 可与 byte,short,char 和 int 原始数据一起使用类型。它也适用于 enumerated types (枚举类型)(在...
本文主要给大家介绍了...因此,Go语言的switch语句又分为表达式switch语句和类型switch语句。 1、表达式switch语句 var name string ... switch name { case Golang: fmt.Println(Golang) case Rust: fmt.Println
C语言switch语句 ——教学案例分析PPT学习教案.pptx
switch语句的使用例子
38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip38.java中的switch语句.zip...
c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助
1、.了解C语言的逻辑运算2、.学会使用if语句和switch语句3、.熟练掌握选择结构程序设计方法
switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console.log(a); break; default: break; } 这里a和case列表中从上而下逐一做比较,如果...
C语言switch语句PPT课件.pptx
switch 语句 语法 使用规则 介绍的很详细
C++语言:switch语句最详细讲解。从switch语句的执行过程,switch语句的注意要点,例题讲解,作业等 。适合于中小学生,信息学爱好者。
C语言switch语句 ——教学案例分析PPT课件.pptx
switch 语句的写法 简单的一个代码,简述java语言switch、语句的编写
javascript,switch语句,判断年龄段
c语言程序设计简单的switch语句的用法
js switch 语句练习 最简洁 注释说明必看 谢谢!JS常交流,祝你们早日学好网站编程!
内容涵盖了switch语句的定义、基本语法、使用场景、优点、注意事项、与if语句的区别、实战应用、多重分支、范围检查、字符串处理、默认情况、性能考虑、灵活性、多态性、安全性、调试、性能优化和最佳实践等高级知识...
switch语句大全switch语句大全
该案例是我在java教材上抄的,用于演示switch语句的用法,其介绍了switch语句的基本用法,常用于选择有限的某个项目的编写,将各个情况列出像case 1, case 2等等,每个case后再加一个break;用于退出该switch语句。...