Java性能优化-switch性能优化-用String还是int做比较

news2024/9/21 4:21:18

场景

Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化:

Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数-CSDN博客

参考以上性能测试工具的使用。

下面针对Java中对switch-case比较时使用String还是int性能做对比。

注:

博客:
霸道流氓气质-CSDN博客

实现

优化思路

JDK1.7之前,switch是不支持String的,实际上switch只支持int类型。

在JDK1.7中的String类型,其实在编译的时候会使⽤hashCode来作为 switch 的实际值。

如果要优化switch只需要把String类型变成int类型就可以了,这样就剩了每个case中进⾏if判断的性能消耗。

注意事项

需要注意 hashCode 重复的问题,例如对于字符串“Aa”和“BB”来说,他们的 hashCode 都是 2112,

因此在优化是需要注意此类问题,也就是说我们使⽤ hashCode 时,必须保证判断添加的值是已知的,并且最好不要出现 hashCode 重复的问题。

测试性能

先求出需要case的字符串的hashcode确保没有重复

        System.out.println("1".hashCode());//49
        System.out.println("3".hashCode());//51
        System.out.println("5".hashCode());//53
        System.out.println("7".hashCode());//55
        System.out.println("9".hashCode());//57
        System.out.println("Aa".hashCode());//2112
        System.out.println("BB".hashCode());//2112

这里我们只使用1 3 5 7 9这几个不重复的字符串做对比,编写测试类

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import java.util.concurrent.TimeUnit;

//if快还是switch快
//测试完成时间
@BenchmarkMode(Mode.AverageTime)
//设置统计结果的时间单位
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2,time = 1,timeUnit = TimeUnit.SECONDS)
//测试次数和时间,参数同上
@Measurement(iterations = 5,time = 1,timeUnit = TimeUnit.SECONDS)
//fork一个线程,进行 fork 的次数,可用于类或者方法上。如果 fork 数是 2 的话,则 JMH 会 fork 出两个进程来进行测试。
@Fork(1)
//通过 State 可以指定一个对象的作用范围,JMH 根据 scope 来进行实例化和共享操作。@State 可以被继承使用,
//Scope.Thread:默认的 State,每个测试线程分配一个实例
@State(Scope.Thread)
public class SwitchOptimizeTest {
    static String _NUM = "9";

    public static void main(String[] args) throws RunnerException {
        //启动基准测试
        Options options = new OptionsBuilder()
                .include(SwitchOptimizeTest.class.getSimpleName())//要导入的测试类
                .build();
        new Runner(options).run();//执行测试
    }

    @Benchmark
    public void switchString(){
        int num1;
        switch (_NUM){
            case "1":
                num1 = 1;
                break;
            case "3":
                num1 = 3;
                break;
            case "5":
                num1 = 5;
                break;
            case "7":
                num1 = 7;
                break;
            case "9":
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }

    @Benchmark
    public void switchInt(){
        int num1;
        switch (_NUM.hashCode()){
            case 49:
                num1 = 1;
                break;
            case 51:
                num1 = 3;
                break;
            case 53:
                num1 = 5;
                break;
            case 55:
                num1 = 7;
                break;
            case 57:
                num1 = 9;
                break;
            default:
                num1 = -1;
                break;
        }
    }
}

测试结果

//Benchmark                        Mode  Cnt  Score   Error  Units
//SwitchOptimizeTest.switchInt     avgt    5  1.214 ± 0.101  ns/op
//SwitchOptimizeTest.switchString  avgt    5  2.924 ± 0.226  ns/op

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM 合成数据生成完整指南

大型语言模型是强大的工具,不仅可以生成类似人类的文本,还可以创建高质量的合成数据。这种能力正在改变我们进行 AI 开发的方式,特别是在现实世界数据稀缺、昂贵或隐私敏感的情况下。在本综合指南中,我们将探索 LLM 驱动的合成数据…

访问控制的定义与原理

访问控制(Access Control)是一种重要的安全机制,用于限制对程序中的数据、函数、类以及计算机系统中资源(如文件、数据库、网络设备等)的访问权限。其主要目的是保护系统中的敏感信息和资源,防止未经授权的访问和操作,确保系统的安全性、完整…

无向图的双连通分量——AcWing 395. 冗余路径

无向图的双连通分量 定义 在无向图中,一个双连通分量(Biconnected Component, BCC)是指这样的子图:删除其中任意一个顶点都不会使这个子图分离成两个或更多个不相连的子图。换句话说,双连通分量是无割点的极大连通子…

lua 脚本语言 : 基础到高级语法

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

[Python学习篇] Python异常

什么是异常&#xff1f; 异常&#xff08;Exception&#xff09;是指在程序执行过程中发生的错误事件&#xff0c;它会中断程序的正常执行流程。异常可以由程序中的错误引发&#xff0c;也可以通过主动抛出异常来处理特殊情况。Python 使用异常处理机制来捕获和处理这些错误&am…

初识c++(构造函数,析构函数,拷贝构造函数,赋值运算符重载)

一、类的默认函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 #include<iostream> using namespace std; class Date { public:Date(){_year 1;_month 1;_day 1;cout << _year << "/" <&…

日常的学习

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 7.11 resAndroidManifest 笔记 <> <> selector shape resources main下的AndroidMainifest.xml文件 application …

sql注入时间盲注

基于时间的盲注 也叫延时注入。通过观察页面&#xff0c;既没有回显数据库内容&#xff0c;又没有报错信息也没有布尔类型状态&#xff0c;那么我们可以考虑用“绝招”--延时注入。延时注入就是根据页面的响应时间来判断是否存在注入&#xff0c;一点一点注入出数据库的信息。我…

【进阶】利用python内置模块自动化发送邮件及邮件附件

目录 自动化发送邮件 流程&#xff1a; 步骤&#xff1a; 【重点】 【MIMEText--发送文本类型的邮件】 【MIMEImage-发送附件为图片的邮件】 【MIMEBase--发送附件为html报告的邮件】 自动化发送邮件 以qq邮箱为例&#xff0c;提前打开POP3/IMAP/SMTP/Exchange/CardDAV 服…

【web]-信息收集-空白页面

打开是一张图 查看源码&#xff0c;发现就一个链接是有用信息&#xff0c;用目录扫描工具&#xff0c;没有发现有价值的信息。 F12&#xff0c;查看请求和相应信息&#xff0c;在响应头中发现了信息。 还有一个小技巧&#xff1a;点击手机图标&#xff0c;可以切换到手机模式中…

Web浏览器485通讯读取RFID卡号js JavaScript

本示例使用设备&#xff1a;485通讯液显带键盘RFID打菲计件读卡器工位机串口可二次开发编程-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …

计组_总线

2024.06.21&#xff1a;计算机组成原理总线学习笔记 第23节 总线 3.1 总线的基本概念&#xff08;联想数据通路&#xff09;3.2 总线的分类3.2.1 片内总线&#xff08;CPU芯片内部的总线&#xff09;3.2.2 系统总线3.2.3 通信总线&#xff08;跨系统&#xff0c;408一般不考&am…

四个“一体化”——构建数智融合时代下的一站式大数据平台

随着智能化技术的飞速发展&#xff0c;尤其是以生成式AI为代表的技术快速应用&#xff0c;推动了数据与智能的深化融合&#xff0c;给数据基础设施带来了新的变革和挑战。如何简化日益复杂的系统架构&#xff0c;提高数据处理效率&#xff0c;降低开发运维成本&#xff0c;促进…

十、(正点原子)Linux阻塞和非阻塞IO

阻塞和非阻塞 IO 是 Linux 驱动开发里面很常见的两种设备访问模式&#xff0c;在编写驱动的时候一定要考虑到阻塞和非阻塞。这里的“IO”并不是我们学习 STM32 或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的 IO 指的是 Input/Output&#xff0c;也就是输入/输出&…

matlab支持向量机使用错误

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

使用Qt和mitmproxy开发一个抓取网页短视频的万能工具

目录 实现原理 mitmproxy介绍 功能简介 安装 脚本示例 如何使用 解释 注意事项 QT工具实现 其他资源 实现原理 使用WebView组件造一工具,工具可输入网页地址并显示网页内容及播放视频。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监…

MySql性能调优03-[SQL优化]

SQL优化 MySQL优化SQL优化-不要写select *SQL优化-小表驱动大表&#xff0c;而不是大表驱动小表SQL优化-连接查询代替子查询SQL优化-提升group by的效率 MySQL优化 trace工具 set session optimizer_traceenabledon,end_markers_in_json on; -- 开启trace select * From emplo…

指针详解(2)

指针详解(2) 对数组名的理解 在C语言里数组名还表示着数组首元素地址。 int arr[5] {1, 2, 3, 4, 5}; int* p &arr[0]; int* p arr;以上这两种&#xff0c;对指针p进行赋值的操作均是等价的&#xff0c;都将数组首元素的地址赋给指针p。 不妨&#xff0c;我们可以测…

【C++进阶学习】第六弹——set和map——体会用C++来构建二叉搜索树

set和map基础&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 前言&#xff1a; 在上篇的学习中&#xff0c;我们已经学习了如何使用C语言来实现二叉搜索树&#xff0c;在C中&#xff0c;我们是有现成的封装好的类模板来实现二叉搜索树…

SpringBoot新手快速入门系列教程六:基于MyBatis的一个简单Mysql读写例子

我的教程都是亲自测试可行才发布的&#xff0c;如果有任何问题欢迎留言或者来群里我每天都会解答。 MyBatis和JPA是两种不同的Java持久层框架&#xff0c;各有其优缺点。以下是它们的比较&#xff1a; MyBatis 优点 灵活性高&#xff1a;MyBatis允许手动编写SQL查询&#xf…