switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。

具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

由此看来,switch有点以空间换时间的意思,而事实上也的确如此。

1.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。

2.由上面的汇编代码可知道,switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。

3.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。

1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化

2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选

择执行哪一个case的语句块

3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载

一次。

所以在多路分支时用switch比if..else if .. else结构要效率高。

首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。

说到基本类型的数值比较,那当然要有两个数。然后重点来了——

if 语句每一句都是独立的,看下面的语句:

if (a == 1) ...

else if (a == 2) ...

这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。

于是 switch case 就出来了,把上面的改成 switch case 版本:

switch (a) {

case 0:

break;

case 1:

}

3.

因为当虚拟机读到switch的时候将所有的判断数据都加载在内存中了,而if是边判断边加载,所以就慢一些,

一般如果判断数据不多,而且是byte,short,int或是char类型的时候一般用switch,那样效率比较高.

Java中(C不知道):如果case中的值比较稀疏,则使用lookupswitch:

可以看到其中的

3:lookupswitch{ //4

3: 44;

20: 55;

50: 66;

100: 77;

default: 85 }

这个就要挨着查表确定跳转位置了。

php中switch与ifelse的效率分析

1.当被判断的值是常量(固定不变的值)时,switch的运行效率比ifelse的运行效率高: $jiejie=3;   // 变判断的值为常量 switch($jiejie){   case 1:   ...

【2018&period;04&period;27 C与C&plus;&plus;基础】关于switch-case及if-else的效率问题

对于这个问题自己是比较清楚的,在分支比较多时,switch-case的效率肯定比if-else的要高许多,其原理类似于我们在优化某些程序时使用查表来代替算法计算一样. 如果想进一步深究的话,可以查看G ...

c语言if-else的效率比较

闲着没事测试下if-else的执行效率 测试环境:Mac pro i7 2.3Ghz ...编译器gcc 4.9,代码没有进行优化-O0: 测试代码:c代码1: int main(){ int n=1 ...

springboot中使用自定义注解实现策略模式&comma;去除工厂模式的switch或ifelse&comma;实现新增策略代码零修改

前言 思路与模拟业务 源码地址 https://gitee.com/houzheng1216/springboot 整体思路就是通过注解在策略类上指定约定好的type,项目启动之后将所有有注解的typ ...

LeetCode - 13&period; Roman to Integer - 思考if-else与switch的比较 - &lpar; C&plus;&plus; &rpar; - 解题报告

1.题目: 原题:Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range ...

if-else、switch、while、for

文章主要会涉及如下几个问题: if-else 和 switch-case 两者相比谁的效率会高些?在日常开发中该如何抉择? 如何基于赫夫曼树结构减少 if-else 分支判断次数? 如何巧妙的应用 d ...

转!论if else与switch的效率高低问题

转 下面来详细描述switch与ifelse的区别. switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转 ...

if else和switch的效率

switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true. 说实话  我也没有深入研究过这个问题的根源  ...

if else 和 switch的效率

switch在判断分支时,没有判断所有的可能性,而是用一个静态表来解决这个问题,所以速度要比if-else快. 但是,switch对较复杂的表达式进行判断,所以当我们需要判断一些简单数值时,用swit ...

随机推荐

Linux Core Dump

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”).我们可以认为 core dump 是“内存快 ...

Java 关键字static final使用总结

Static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...

JavaScript DOM 编程艺术(第2版)读书笔记(4)

案例研究:JavaScript 图片库 改变图片的src属性的两种方式: 1,setAttribute方法是“第1级DOM”的组成部分,它可以设置元素节点的任意属性. 2,element.src = ...

tar 报错gzip&colon; stdin&colon; not in gzip format

今天在linux下 用tar -zxvf xxx.tar.bz2 然后就报这个错. gzip: stdin: not in gzip formattar: Child returned status ...

开放源代码的设计层面框架Spring——day01

spring第一天     一.Spring概述         1.1spring概述             1.1.1spring介绍                 Spring是分层的Jav ...

&lbrack;Swift&rsqb;LeetCode394&period; 字符串解码 &vert; Decode String

Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...

mysql安装-CentOS6下解压安装mysql-5&period;7&period;20-linux-glibc2&period;12-x86&lowbar;64&period;tar&period;gz

删除已经安装版本 yum list installed mysql [root@localhost ~]# yum list installed mysql Loaded plugins: faste ...

【读书笔记】iOS-UI Automation 需要遵守的规则

1,被测试的应用程序必须是Developer签名的应用程序或者是运行在模拟器里面的应用程序. 2,在被测试的应用程序开发的过程中需要处理UI控件的可访问性.使用IB的开发工程师需要在XIB中加入一个A ...

java执行Shell命令

java程序中要执行linux命令主要依赖2个类:Process和Runtime首先看一下Process类:ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机 ...

手机PC文件传输

QQ啥的现在直接无法全部退出,很纠结后台运行,时不时的来条消息,明明电脑QQ还开着,越来越流氓了. 服务端代码: & ...

switch if c语言效率,switch与ifelse的效率问题相关推荐

  1. switch matlab c语言,matlab switch语句使用

    switch 块有条件地执行一组语句从几个选择.每个选项所涵盖的一个 case 语句. 计算 switch_expression 是一个标量或字符串. 计算case_expression是标量,标量或 ...

  2. c语言中switch结构,switch结构c语言

    C语言中switch结构的使用 用switch结构编制程序,输入1个学生的C语言课程考试成绩(百分制整形数因为case后面不能接范围,也就是说case后面是一个确实固定的常量.用下面的方法比较好, # ...

  3. c语言 字符串switch,C++中如何对字符串进行switch

    C++中如何对字符串进行switch判断? C++的开关语句,形式为 switch(expr1) { case no1: break; case no2: break; ... case noN: b ...

  4. c语言字符串switch用法,C语言switch 语句的用法详解

    搜索热词 C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的 ...

  5. c语言if语句习题,大学c语言if switch for 语句实验四练习题

    大学c语言if switch for 语句实验四练习题 实验四 [实验目的] 1. 熟悉和掌握if.switch的使用方法:学会编写简单的分支程序结构. 2. 熟悉for语句的一般形式,学会编写简单的 ...

  6. switch c语言格式,switch语句格式是什么

    switch语句格式为[switch(表达式){case 值1:语句体1:break:case 值2:语句体2:break:]:其中break表中断的意思,所有的值都不匹配的时候,就执行语句体defa ...

  7. c语言的编程switch,C语言之switch详解

    一 switch的语法 switch(表达式){ case 常量表达式1: 代码块1 break; case 常量表达式2: 代码块2 break; case 常量表达式3: 代码块3 break; ...

  8. switch c语言格式,switch语句格式是什么?

    switch语句 Switch在一些计算机语言中是保留字,其作用大多情况下是进行判断选择:常和case.break.default一起使用. switch语句可以用于基于不同的条件来执行不同的动作. ...

  9. c语言switch判断字母,判断switch 语句 - C语言教程

    C switch 语句 一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. 语法 C 语言中 switch ...

最新文章

  1. Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level...
  2. mysql-数据库模式定义语言(DDL)
  3. 快排,归并和Shell排序
  4. 【朝夕技术专刊】WebApi部署多服务器配置Nginx负载均衡
  5. python 读取csv文件转成字符串_从CSV读取到 dataframe pandas python时dict对象转换为字符串...
  6. Java架构师面试题系列之Mybatis面试专题(36题,含详细答案解析)
  7. python模块time_python模块之time和datetime
  8. linux下修改mysql数据存储_Linux下修改MySQL数据存放目录方法及可能遇到的问题--转...
  9. 文件系统系列之一:fat文件系统的结构分析
  10. git reset HEAD 用法
  11. ③企业虚拟化Kvm 管理、kvm高级命令、磁盘格式转换、挂载磁盘、第三篇
  12. 微信小程序实现活动轨迹回放
  13. 怎么添加设置微信定位服务器,微信怎么设置定位功能!
  14. 数据结构与算法课程设计之五子棋(人机)
  15. HIDS-ebpf-0
  16. 基于微信小程序图书借阅管理系统(微信小程序毕业设计)
  17. 苏州大学2021年全日制博士学位研究生招生简章
  18. 如何看待央行聚合支付的政策走向?
  19. 目标检测经典论文——Fast R-CNN论文翻译(中英文对照版):Fast R-CNN(Ross Girshick, Microsoft Research(微软研究院))
  20. 云栖大会 mysql_2019云栖大会 数据库

热门文章

  1. Bartender软件标签打印
  2. Linux 基础-第2章 系统用户/组管理
  3. java个人主页作业,个人项目 - 作业 - 18软件前端、JAVA WEB方向 - 班级博客 - 博客园...
  4. Rhythmbox 0.9.8
  5. springboot 集成p6spy
  6. wdcp mysql 安装失败_解决WDCP安装错误Install Error:mysql configure err
  7. MW明纬电源维修RSP-3000-24 PFC开关电源修理RST-5000-24/48
  8. asp,php,aspx一句话合集
  9. 2048小游戏 无限反悔 存档版
  10. 欧姆龙CP1H与三菱变频器通讯 CIF01(232串口方式) 欧姆龙CP1H 与变频器modbus 通讯案例