`
guiven
  • 浏览: 28773 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何优化switch语句

阅读更多
如何优化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

    C语言switch语句学习教案 switch 语句是 C 语言中处理多路选择问题的一种更直观和有效的手段。在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。当然可以使用嵌套的 if , if else 语句来处理,但其...

    C语言switch语句 ——教学案例分析PPT学习教案.pptx

    本教学案例分析PPT学习教案的主要目的是帮助中职计算机专业学生学习C语言switch语句的格式、执行过程和应用,达到掌握switch语句的格式、理解switch语句的执行过程、掌握阅读、调试switch程序的能力、掌握switch语句...

    C语言switch语句 ——教学案例分析PPT课件.pptx

    主要教学目标包括掌握 switch 语句的格式、理解 switch 语句的执行过程、理解与其他语句的异同、掌握阅读、调试 switch 程序的能力、掌握 switch 语句实现多分支选择结构、领悟使用 switch 语句解决实际问题等。...

    C语言switch语句PPT课件.pptx

    C语言switch语句PPT课件 C语言switch语句是多分支选择语句,在实际应用中需要在多种情况中选择一种情况,执行某一部分语句。switch语句是C语言中处理多路选择问题的一种更直观和有效的手段。 在测试某个表达式...

    C++语言:switch语句最详细讲解.pdf

    C++语言switch语句详解 switch语句是C++语言中的一种控制流语句,用于根据不同的条件执行不同的代码块。在本文中,我们将详细介绍switch语句的执行过程、注意要点、例题讲解和作业等。 一、switch语句的执行过程 ...

    c 语言 switch 语句学习

    ### C 语言中的 Switch 语句详解 #### 一、Switch 语句的基本概念与语法结构 Switch 语句是 C 语言中的一种选择结构,主要用于实现多分支选择的功能。其基本语法结构如下: ```c switch (表达式) { case 常量...

    c语言if语句实例_C语言if语句和switch语句实例_If..._

    本篇文章将深入探讨C语言中的if语句和switch语句,这两种选择结构是控制程序流程的重要工具,使得代码可以根据不同的条件执行不同的操作。 首先,我们来详细了解一下if语句。if语句是基于条件执行特定代码块的基础...

    Golang中switch语句和select语句的用法教程

    本文主要给大家介绍了...因此,Go语言的switch语句又分为表达式switch语句和类型switch语句。 1、表达式switch语句 var name string ... switch name { case Golang: fmt.Println(Golang) case Rust: fmt.Println

    C语言中分支结构:if语句、if-else语句和switch语句的使用方法.docx

    C语言中分支结构:if语句、if-else语句和switch语句的使用方法 C语言中分支结构是一种非常基本但非常重要的编程结构,它允许程序根据条件执行不同的代码块。在C语言中,分支结构有三种基本类型:if语句、if-else...

    switch语句通过用户输入的年龄判断年龄段并输出

    javascript,switch语句,判断年龄段

    switch语句的使用例子

    switch语句的使用例子

    38.java中的switch语句.zip

    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...

    switch语句,算利润

    c语言程序设计教程(第二版)谭浩强,经典例题,对于学习c语言有很大帮助

    C语言中的switch语句基本用法

    C语言中的switch语句基本用法 switch语句是C语言中的一种多分支选择语句,能够简化代码,提高代码的可读性和维护性。下面将详细介绍switch语句的基本用法和应用。 switch语句的基本格式 switch语句的基本格式如下...

    switch语句的妙用(必看篇)

    switch语句的普通用法很简单,如下: var a = 3; switch (a) { case 1: console.log(a); break; case 2: case 3: console.log(a); break; default: break; } 这里a和case列表中从上而下逐一做比较,如果...

    switch语句

    在`js_switch语句练习`这个练习文件中,你可能会发现更多关于`switch`语句的实践案例,包括不同类型的比较、复合表达式的使用以及如何结合其他控制流结构(如`for`循环)来实现更复杂的逻辑。通过这样的练习,你可以...

    switch语句大全下载

    《switch语句大全》 在编程领域,switch语句是一种常用的控制流程结构,它提供了多路选择执行的能力,尤其在处理多个可能的情况时非常高效。本文将深入探讨switch语句的使用、语法、特点以及在不同编程语言中的差异...

    C语言switch语句ppt课件.ppt

    C语言switch语句 C语言switch语句是一种多分支选择语句,用于在多种情况中选择一种情况,执行某一部分语句。switch语句的主要特点是可以根据表达式的值来选择执行的分支,且可以使用break语句来退出switch结构。 ...

    MATLAB实现SWITCH语句

    SWITCH语句在MATLAB中的应用,条件一成立,执行条件一,条件二成立执行条件二语句,否则跳出循环。

    c语言程序设计 switch语句

    在C语言中,`switch`语句是一种流程控制结构,用于根据不同的条件执行相应的代码块。它提供了一种更简洁的方式来替代多个`if...else if...else`语句。在这个程序设计实例中,我们看到一个如何巧妙使用`switch`语句的...

Global site tag (gtag.js) - Google Analytics