代码优化(一)----- ifelse OR switch

OpenClaw界面操作手册:命令行与交互模式的正确打开方式 "test": {"description": "运行项目的测试套件","prompt": "请执行项目的测试命令,并分析测试结果。如果有失败的测试,请提供修复建议。},"lint": {"description": "运行代码检查","prompt": "请运行代码检查工具,分析所有警告和错误,并提供修复建议。},"doc": {"description": "为当前文件生成文档","prompt": "请为当前打开的文件生成完整的API文档,包括函数说明、参数描述、返回值类型和使用示例。 阅读详情

这篇是C的,但是感觉原理上说的很清楚 https://www.cnblogs.com/idorax/p/6275259.html

简而言之,就像ifesle和switch本身看上去的那样,ifesle要一条条判断,然后找到符合条件的分支,再进入方法体执行;但是switch像是“直接匹配”到对应的case上一样,没有从第一条开始一条条判断。

实现原理上,ifesle是顺序执行的cmp,je/jne(汇编)实现的,跳转到每个分支方法体的位置。而switch在汇编阶段根据每个case值,算出每个分支方法体的位置,真正执行时,只要把拿到的值当做偏移量加上基地址就可以直接得到分支方法体入口位置。

如果非要做类比的话,判断条件作为key,分支方法体作为value,那么ifelse的策略是做一个二维数组A[N][2],编译阶段将所有ifesle条件放入A[i][0],对应的分支方法体放入A[i][1],每次传入一个key时,遍历数组A[N][0],直至找到key对应的A[i][0],然后A[i][1]就是分支地址,复杂度为O(N);

switch是做了个HashMap,编译阶段直接将每个case的值和对应的方法体塞进HashMap,每次传入一个key,直接找到方法体。复杂度为O(l)。

口说无凭,来试验一哈:

ifelseFunc() :

switchFunc() :

测试:

有点尴尬,好像差不太多,更严重地是,有时switch更慢!!

反汇编可以看到Java编译到class进行了一个改动:

 

即Java对switch进行了“哈希的哈希”

新建了一个新变量var2,用于跳转到真正的分支方法体。

当然,还有几个小细节:

① Java 1.7以后switch开始支持String作为变量,但是反编译的结果显示:

本质上还是去比较int型的hashCode()。

 

② 新建了一个var2作为“中间哈希”,其类型为byte,初始值为-1

1)这是否意味着Java的switch最多只支持到127个分支?还是说当大于127可能就用short更大来声明var2...

2)还有,可以看到,每个case分支都将var2重新赋值,而且是从0开始,这从之前那篇博文也可以找到根据,第一个偏移量为0更易操作,比如现在,由于switch判断的变量是String.hashCode(),一般都不会小(31*a[n-1]+31*a[n-2].......),就比如上面例子中虽然是1,2...10但是也变成了:

这样直接拿来计算偏移量肯定很浪费空间,还不如作二次映射,映射到“从0开始,连续的var2"上去,这样在switch(var2)中(真正的分支方法体映射地)var2可以直接拿来计算偏移量。

这是否是Java对switch进行二次哈希的真正原因也不太清楚。。。

3)var2初始值是-1,每个case分支都将var2重新赋值,那default呢:

 答案是没有,如果没有找到相应的case,则var2不变,仍为-1。再去看方法体switch(var2):

所以var = -1就是用来标记的,不同于其他情况的var2值。

④ 因为Java对equals()方法和hashCode()规范中,是equals方法同,则hashCode()一定一样;反之不成立。

所以在进行hashcCode()判断之后,还要进行一次equals()方法的判断,都满足才代表真正符合当前的case,才能进入方法体——这也符合判断String是否相等的逻辑——直接equals(),那么问什么不直接switch(equals())呢,因为不能转换为整数啊。。。这switch的实现机制就矛盾。

⑤ 问题来了,因为String的hashCode(0一般都很大,所以二次哈希是可以理解的(如果真是这个原因的话),那么对于普通的数呢?

 

测试结果:

结果没多大区别。。。

反汇编结果:

可以看到,即使第一个case是10000,编译器也没有作二次哈希,并且,在编译之后,case是按大小排列的。

 

还可以注意到一个小细节:

ifelseFunc反汇编结果:

 

① 为每一个if   else if    else都加上了花括号

② if   else if    else后面的括号,花括号中间都有一个空格

这是不是一般的编码规范(例如阿里巴巴Java编码规范)要求的原因呢——除了更美观以外,你写的代码都要送给编译器编译的,你所做的越符合编译器规范,编译时重新修改的就越少,编译就越快。

2026 蓝牙技术趋势展望:信道探测、Auracast、高吞吐 HID 与 AI 融合引领行业变革 蓝牙技术2026年展望:信道探测、Auracast广播音频和AI融合将引领创新。蓝牙信道探测技术将实现亚米级精确定位,在工业资产追踪和汽车数字钥匙领域大显身手。Auracast广播音频将持续拓展公共场所应用,提升音频包容性体验。高数据吞吐量和超低延迟功能将支持AR/VR等新兴场景。AI与蓝牙的深度融合将推动可穿戴设备智能化发展,实现实时健康监测和个性化音频服务。蓝牙技术凭借其多功能性和创新力,正成为连接万物的关键技术,持续推动行业变革和生活品质提升。 阅读详情

相关推荐

零代码做游戏:AI辅助开发HTML5网页小游戏从创意到发布全流程

在软件开发领域,自然语言编程正成为一种新兴的人机协作方式,而AI辅助开发则是其最典型的落地形态。它让开发者无需精通语法,只需用清晰的语言描述游戏规则与交互逻辑,AI便能自动生成可运行的代码。这种模式大幅降低了编程门槛,尤其适合快速验证创意、制作原型。对于HTML5网页游戏而言,借助AI生成单个HTML文件,配合在线运行环境,即可在浏览器中直接试玩、迭代与分享。无论是产品经理验证玩法、运营人员制作互动小游戏,还是教育者设计课堂闯关,都能通过自然语言描述需求,让AI完成代码实现与报错修复。本文完整记录了一个“接

weixin_31497453的博客 328

教妹学Java(十三):if-else 语句详解

大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。本篇文章通过我和三妹对话的形式来谈一谈“if-else 语句”。 教妹学 Java,没见过这么有趣的标题吧?“语不惊人死不休”,没错,本篇文章的标题就是这么酷炫,接受不了的同学就别点进来看了,所谓好奇心害死猫;能够接受的同学我只能说你赚到了,你不仅能在阅读的过程中感受到思维的乐趣,还真的能学习到知识。下面就由我来介绍一下故事的背...

沉默王二 2万+

离散数学期末考试试卷(两套)-熟悉题型

3.设集合A={a,b,c,d}上有自反关系R={,,,,},对称关系S={,,,}。6.设集合A={1,2,3},B={u,v,w},C={a,b,c},f是集合A到集合B上的映射,g是集合B到集合C上的映射,f={, , },g={},则复合函数g。5. 设集合A={a,b,c,d,e},下列选项中哪一个集合不是A的划分( )。

muse3159546973的博客 6956

Python学习基础知识之 判断语句 的基本使用:(if--esle循环嵌套使用) (比较运算符)

目录 判断语句内容大纲: 一、if判断语句 1.1if判断语句案例 1.2if判断语句的作用: 二、比较(即关系)运算符 2.1python中的比较运算符: ​2.2比较(即关系)运算符案例 三、逻辑运算符 ​ 3.1逻辑运算符案例 四、if-else的基本使用 4.1if-else的使用格式: 4.2if-else的使用案例 五、el-if的基本使用功能 5.1elif的使用格式如下: 5.2elif的使用案例 5.3elif特别强调 ...

HelloGuoYing的博客 730

SAP增强实施-第四代显式和隐式增强技术介绍

概念介绍 SAP第四代增强- Enhancement-Point,分为2种显式增强和隐式增强,显式增强就是手动加入到程序中的Enhancement options,隐式增强就是系统内置的Enhancement options。 第四代增强其实是第三代上的加强,都属于面向对象语言的接口技术的应用,但第四代增强使SAP增强实施更具灵活性,四代增强可以直接在源代码里面写增强了代码了,输入参数也不像 二代...

weixin_40672823的博客 7953

gm/Id 设计方法

本文介绍gm/Id方法的具体实现。

maxwell2ic的博客 4万+

深入理解条件控制语句 :if-else

if-else语句是一种二分支选择结构,用于根据条件的真假来决定执行哪一段代码。if (条件) {// 条件为真时执行的代码块} else {// 条件为假时执行的代码块。

epitomizelu的专栏 9087

Tesseract in Java - Intellij IDEA对Tess4J的配置和使用

最近要弄OCR,搜到这个,官网全英文,很烦,看看有没有中文的博客介绍,擦,一个比一个奇葩,还是自己按照官方的来吧,外网慢的很,传到csdn给大家下载。中文训练库下载地址: http://download.youkuaiyun.com/detail/d_dmelon/9916532Tess4J3.4下载地址: http://download.youkuaiyun.com/detail/d_dmelon/9916519安装

Lewis的博客 1万+

if与else的多种嵌套关系

C语言中由一个分号(;)隔开的就是一条语句。

LJY_CF的博客 7894

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

Ubuntu系统下MRIcroN、FSL6.0.5、Freesurfer7.1.1、ANTs、MRtrix3、AFNI的安装详解——核磁共振数据处理必备

Ubuntu系统下MRIcroN、FSL6.05、Freesurfer7.1.1、MRtrix3、AFNI、ANTs的安装详解一、安装MRIcroN二、 FSL6.0.5完整安装与FSLeyes等Not Found修复Anaconda与虚拟环境(所有操作均在root下)获取最新版Anaconda3安装Anaconda3配置所有用户可用去掉恼人的base创建虚拟环境FSL与FSLeyes安装(所有操作均在root下)下载FSL安装FSL添加环境变量到/etc/bash.bashrc末尾 (ubuntu)或者

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 6085

选择分支语句查找效率-switch,if-else,数组

一.总结 数组=哈希表(每个键值只有一个元素),查找时间O(1)空间O(n) if-else串行查找,将可能性越大的放在越靠前位置可提高查找效率,尽快找到,减少比较次数,最差查找时间O(n) switch三种查找方法 case项较少,或case整数值不连续,二分法查找,查找时间O(logn) case项较多,且case整数值连续:跳转表,同数组,查找时间O(1)空间O(n) 跳转表工作方法...

ainu412的博客 480

YOLOv11改进 | Conv篇 | AKConv轻量级架构下的高效检测(附代码 + 修改方法 + 二次创新)

本文给大家带来的改进内容是AKConv是一种创新的变核卷积,它旨在解决标准卷积操作中的固有缺陷(采样形状是固定的),AKConv的核心思想在于它为卷积核提供了任意数量的参数和任意采样形状,能够使用任意数量的参数(如1, 2, 3, 4, 5, 6, 7等)来提取特征,这在标准卷积和可变形卷积中并未实现​​。AKConv能够根据硬件环境,使卷积参数的数量呈线性增减非常适用于轻量化模型的读者)。

Snu77的博客 1万+

枚举策略如何代替ifelse以及switch语句

前提: 手机分为四种状态(关机,休眠,运行,待机) 现拥有五十个实例(五十部手机) 需求: 统计各个状态的实例个数 当你需要统计一些不同类型的数量时,你或许第一时间想到的是ifelse或者switch语句,那么实际应该是这个样子的。 手机状态枚举类: package hyy.element; public enum PhoneTypeEnum { SHUTDOWN("关...

qq_38621053的博客 1270

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

switch与ifelse的效率问题

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

Jams_5201314的博客 311

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

PHP的switch和ifelse谁更快?

PHP的switch和ifelse谁更快?对于多个if条件判断的情况下,我们使用switch来代替ifelse对于代码来说会更加的清晰明了,那么他们的效率对比呢?从PHP手册中发现有人已...

硬核项目经理 605

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

php中switch与ifelse的效率区别

PHP中有两个方法都是用于判断值是否满足条件,如果满足/不满足做出不同行为动作。  不管写什么语言的程序,一定会考虑到代码的运行效率问题。在查阅了一些资料后,switch与ifelse在不同的‘环境’下效率各有优胜。  1、当被判断的值是常量(固定不变的值)时,switch的运行效率比ifelse的运行效率高; 1 2 3 4 5 6

大庄园 875

ifelse,switch/case替代方案

我们在平时的编码中,我们经常会遇到这样的情况: 使用过多的switch/case 或者 if else 语句,非常不爽,也违背了面向对象的原则: publicstaticValidatornewInstance(StringvalidatorType){ ...

choushi6193的博客 487

php switch 和if,PHP的switch和ifelse谁更快?

对于多个if条件判断的情况下,我们使用switch来代替ifelse对于代码来说会更加的清晰明了,那么他们的效率对比呢?从PHP手册中发现有人已经对比过了,自己也用他的代码进行了实验:$s = time();for ($i = 0; $i < 1000000000; ++$i) {$x = $i % 10;if ($x == 1) {$y = $x * 1;} elseif ($x == 2...

weixin_33462050的博客 268

C语言代码优化之if与else

适用于if else太多,if else嵌套太多、太深,代码优化办法其实很多方法都差不多,优化的核心思想就是将每一段的if else用函数指针和switch进行缩写,然后再进行嵌套,大化小,然后优化项目的逻辑,去掉冗余的部分,这样的代码看起来更好维护而已。追求运行速度,又是另外一种说法了,每段if 或else 都是一段不同的选择,变化那么多,怎么可能避免最小代码基本单元 if else 的量。

Ikun真爱粉,你们这群小黑子【滑稽】 1133

java 多ifelse 怎么设计优化_Java中多个ifelse语句的替代设计

概述ifelse是任何编程语言的重要组成部分。但是我们编写了大量嵌套的if语句,这使得我们的代码更加复杂和难以维护。接下来,让我们探索如何简化代码的中的ifelse语句写法。案例研究我们经常遇到涉及很多条件的业务逻辑,并且每个逻辑都需要不同的处理方式。以Calculator类为例。我们将有一个方法,它接受两个数字和一个运算符作为输入,并根据操作返回结果:我们也可以使用switch语句来实现它:pu...

weixin_39876645的博客 1168

C语言switch分支结构

if else的不足 C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的中文表示。 以上代码摘自book22.c。 对于这种情况,实际开发中一般使用 switch 语句代替,请看下面...

C语言技术网-码农有道 6201

Java 代码优化 switch case 和 if else 语句的效率比较,使用JProfiler比下两者的效率

代码里面写 if else 或者 switch case 语句,很常见,那么这2个写法除了姿势不一样以为,他们的效率是不是也差距比较大呢? 1,switch case 比 一个个if else快吗? 2,switch case会因为case的数据类型越简单,而使得执行效率提高不少吗? 下面测试下 总体来说:2者差别不大,使用谁,代码执行效率,都没有啥质的飞跃。 有的说 switch ...

请叫我大师兄 3440

谨慎对待switch,用Object对象替换switch

if else 方案碰到多种条件判断,很多时候用if else解决了。当出现很多条件时,这种方式会出现 else if 滥用的情况,而且语法会非常的冗长,不断地重复,有错误的余地。switch方案这时候我们用switch取代了 elseif,从一个坑里跳入另外的一个坑。我们必须在每一个执行之后加上break,每个语句中加上case,导致难以调试和嵌套错误。随着条件的增加,性能会非常的差,它要对每...

weixin_34068198的博客 1414

c语言switch case语句范围,C语言switch case语句详解

C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:#include int main(){int a;printf("Input integer number:");scanf("%d",&a);if(a==1){printf("Mo...

weixin_32352213的博客 4030

判断object是list或者string_写C#逻辑判断,不要只知道ifelse 和switch

那天看到一篇文章《写 JS 逻辑判断,不要只知道用 if-else 和 switch》,感觉写的非常好,然后就想到这些想法同样也适用于C#,于是就有了今天这篇文章。其实无论是JS还是C#,更或者Java,Python...,当遇到有很多逻辑判断的时候,我们第一想到的可能就算if-else或者switch。当条件很多时,我们就会发现一个方法中大概有数不清的if-else或者switch(数...

weixin_39738755的博客 2318
上一篇: Java面试基础问题之(六)—— 不能被继承:final,private,static和构造方法
下一篇: 经典算法题之(六)------ 二维数组迷宫问题
ProLayman
博客等级 码龄10年 105粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值