性能测试中唯一标识的JMH测试

news2024/9/17 7:47:29

前文分享了几种性能测试中常用到的生成全局唯一标识的案例,虽然在文中我猜测了几种方案设计的性能,并根据自己的经验给出了适用的场景。

但对于一个性能测试工程师来讲,有真是测试数据才更有说服力。这让我想起来之前学过的Java微基准测试框架 JMH ,所以不妨一试。

JMH简介

JMH (Java Microbenchmark Harness)是一个用于编写和运行Java基准测试的工具。它被广泛用于评估Java应用程序的性能,并帮助开发人员发现和优化性能瓶颈。

JMH的主要特点包括:

  1. 高可信度:JMH提供了多种机制来消除测试过程中的噪音和偏差,确保测试结果的可靠性。

  2. 易用性:JMH提供了丰富的注解和API,使编写和运行基准测试变得相对简单。

  3. 灵活性:JMH支持多种测试模式,如简单的吞吐量测试、微基准测试以及更复杂的测试场景。

  4. 可扩展性:JMH允许用户自定义测试环境,如GC策略、编译器选项等,以满足特定的性能评估需求。

  5. 广泛应用:JMH被广泛应用于Java生态系统中,包括JDK自身的性能优化、第三方开源库的性能评估等。

JMH是Java开发者评估应用程序性能的强大工具,有助于提高Java应用程序的整体质量和性能。同样地对于性能测试而言,也可以通过 JMH 测试评估一段代码在实际执行当中的表现。

实测

除了 使用分布式服务生成GUID 这个方案以外,其他四种方案(其中两种是我自己常用的)均参与测试。原因是分布式服务需要网络交互,这个一听就不高性能,还有我暂时没条件测试这个。

下面有限展示实测结果,总结使用线程共享和线程独享的方案性能均远远高于 UUID 和 雪花算法 。为了省事儿以下测试均预热2次,预热批次大小2,测试迭代次数1次,迭代批次大小也是1次。配置如下:

 
  1.                 .warmupIterations(2)//预热次数

  2.                 .warmupBatchSize(2)//预热批次大小

  3.                 .measurementIterations(1)//测试迭代次数

  4.                 .measurementBatchSize(1)//测试批次大小

  5.                 .build();

PS:JMH 貌似还不支持 Groovy 所以我用 Java 写了这个用例。

下面是运行1个线程的测试结果:

 
  1. UniqueNumberTest.exclusive  thrpt       203.146          ops/us

  2. UniqueNumberTest.share      thrpt        99.860          ops/us

  3. UniqueNumberTest.snow       thrpt         4.096          ops/us

  4. UniqueNumberTest.uuid       thrpt        11.758          ops/us

下面是运行10个线程的测试结果:

 
  1. Benchmark                    Mode  Cnt     Score   Error   Units

  2. UniqueNumberTest.exclusive  thrpt       1117.347          ops/us

  3. UniqueNumberTest.share      thrpt        670.141          ops/us

  4. UniqueNumberTest.snow       thrpt         10.925          ops/us

  5. UniqueNumberTest.uuid       thrpt          3.608          ops/us

PS:此时机器的性能基本跑满了。

下面是40个线程的测试结果:

 
  1. Benchmark                    Mode  Cnt     Score   Error   Units

  2. UniqueNumberTest.exclusive  thrpt       1110.273          ops/us

  3. UniqueNumberTest.share      thrpt        649.350          ops/us

  4. UniqueNumberTest.snow       thrpt          8.908          ops/us

  5. UniqueNumberTest.uuid       thrpt          4.205          ops/us

可以看出跟10个线程结果差不多。

本机配置12核心,以上的测试结果单位是微秒,把结果乘以100万就是每秒的处理量,各位在使用不同方案时可以适当参考。

测试用例

下面是我的测试用例,测试结果我就不进行可视化了。

 
  1. package com.funtest.jmh;

  2. import com.funtester.utils.SnowflakeUtils;

  3. import org.openjdk.jmh.annotations.*;

  4. import org.openjdk.jmh.infra.Blackhole;

  5. import org.openjdk.jmh.results.format.ResultFormatType;

  6. import org.openjdk.jmh.runner.Runner;

  7. import org.openjdk.jmh.runner.RunnerException;

  8. import org.openjdk.jmh.runner.options.Options;

  9. import org.openjdk.jmh.runner.options.OptionsBuilder;

  10. import java.util.UUID;

  11. import java.util.concurrent.TimeUnit;

  12. import java.util.concurrent.atomic.AtomicInteger;

  13. @BenchmarkMode(Mode.Throughput)

  14. //@Warmup(Ω = 3, time = 2, timeUnit = TimeUnit.SECONDS)//预热次数,含义是每个测试会跑多久

  15. //@Measurement(iterations = 3, time = 5, timeUnit = TimeUnit.SECONDS)//测试迭代次数,含义是每个测试会跑多久

  16. //@Threads(1)//测试线程数

  17. //@Fork(2)//fork表示每个测试会fork出几个进程,也就是说每个测试会跑几次

  18. @State(value = Scope.Thread)//默认为Scope.Thread,含义是每个线程都会有一个实例

  19. @OutputTimeUnit(TimeUnit.MICROSECONDS)

  20. public class UniqueNumberTest {

  21. SnowflakeUtils snowflakeUtils = new SnowflakeUtils(1, 1);

  22. ThreadLocal<Integer> exclusive = ThreadLocal.withInitial(() -> 0);

  23. AtomicInteger share = new AtomicInteger(0);

  24. @Benchmark

  25. public void uuid() {

  26. UUID.randomUUID();

  27. }

  28. @Benchmark

  29. public void snow() {

  30. snowflakeUtils.nextId();

  31. }

  32. @Benchmark

  33. public void exclusive(Blackhole blackhole) {

  34. Integer i = exclusive.get();

  35. i++;

  36. blackhole.consume(i + "");

  37. }

  38. @Benchmark

  39. public void share(Blackhole blackhole) {

  40. blackhole.consume(share.incrementAndGet() + "");

  41. }

  42. public static void main(String[] args) throws RunnerException {

  43. Options options = new OptionsBuilder()

  44. .include(UniqueNumberTest.class.getSimpleName())//测试类名

  45. .result("long/result.json")//测试结果输出到result.json文件

  46. .resultFormat(ResultFormatType.JSON)//输出格式

  47. .forks(1)//fork表示每个测试会fork出几个进程,也就是说每个测试会跑几次

  48. .threads(40)//测试线程数

  49. .warmupIterations(2)//预热次数

  50. .warmupBatchSize(2)//预热批次大小

  51. .measurementIterations(1)//测试迭代次数

  52. .measurementBatchSize(1)//测试批次大小

  53. .build();

  54. new Runner(options).run();

  55. }

  56. }

 感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

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

相关文章

记录些MySQL题集(2)

MySQL 不使用limit的分页查询 limit问题&#xff1a;limit&#xff0c;offset递增问题。随着offset的增加&#xff0c;条数不变&#xff0c;耗时却增加了。 limit 0,10 耗时1ms limit 300000,10 耗时152ms limit 600000,10 耗时312ms 毫秒级别可能没感觉。假…

java:aocache 与Spring Aop兼容问题

本文适用于所有AspectJ与Spring AOP混用的场景。 Spring AOP 是基于动态代理的实现AOP&#xff0c;基于 JDK代理和CGLib代理实现运行时织入&#xff08;runtime weaving&#xff09;。 Spring AOP的切面定义沿用了ASpectJ的注解体系&#xff0c;所以在Spring体系中注解定义切面…

Java 将图片转base64和base64转图片

工具 Base64 和 图片互转。 导入的依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>4.0.5</versi…

【Hot100】LeetCode—118. 杨辉三角

目录 题目1- 思路2- 实现⭐118. 杨辉三角——题解思路 3- ACM 实现 题目 原题连接&#xff1a;118. 杨辉三角 1- 思路 思路 爬楼梯&#xff1a;动规五部曲 2- 实现 ⭐118. 杨辉三角——题解思路 class Solution {List<List<Integer>> res new ArrayList<&g…

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。 1.1 系统主要特点 高精度数字电源控制&#xff1a;利用STM32G4的高性能ADC和定时器,实现精确…

2024年肥西县“北斗·劳技科普进校园”赛事活动圆满举行

2024年6月13日肥西县“北斗劳技科普进校园”赛事活动在肥西实验高级中学圆满举行。本次赛事由肥西县关心下一代工作委员会和肥西县教育体育局主办&#xff0c;肥西县航空航海模型协会承办&#xff0c;肥西县实验高级中学协办&#xff0c;并得到了赛哆哆、凡尼科技中心和肥西艾瞳…

为什么渲染农场渲染的是帧,而不是视频?

在3D动画产业的壮阔画卷中&#xff0c;渲染农场作为幕后英雄&#xff0c;以其庞大的计算能力支撑起无数视觉奇观的诞生。这些由高性能计算机集群构成的系统&#xff0c;通过独特的逐帧渲染策略&#xff0c;解锁了单机难以企及的创作自由与效率。本文将深入剖析这一策略背后的逻…

springcloud使用微服务的搭建

微服务的搭建 1.配置对应信息 Springboot 、springcloud、springcloud alibaba对应关系 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 2.pom.xml的配置 2.1 总项目pom.xml引入依赖 <parent><groupId>org.sprin…

从库存超卖问题分析锁和分布式锁的应用(二)

本文从一个经典的库存超卖问题分析说明常见锁的应用&#xff0c;假设库存资源存储在Redis里面。 假设我们的减库存代码如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

linux高级编程(网络)(www,http,URL)

数据的封包和拆包 封包&#xff1a; 应用层数据&#xff08;例如HTTP请求&#xff09;被传递给传输层。传输层&#xff08;TCP&#xff09;在数据前添加TCP头部&#xff08;包含端口号、序列号等&#xff09;。网络层&#xff08;IP&#xff09;在TCP段前添加IP头部&#xff…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇&#xff1a;【从0到1进阶Redis】主从复制 测试&#xff1a;主机断开连接&#xff0c;从机依旧连接到主机的&#xff0c;但是没有写操作&#xff0c;这个时候&#xff0c;主机如果回来了&#xff0c;从机依旧可以直接获取到主机写的信息。 如果是使用命令行&#xff0c;来…

底软驱动 | 大厂面试爱考的C++内存相关

文章目录 C内存相关C内存分区C对象的成员函数存放在内存哪里 堆和栈的区别堆和栈的访问效率“野指针”有了malloc/free为什么还要new/deletealloca内存崩溃C内存泄漏的几种情况内存对齐柔性数组参考推荐阅读 C内存相关 本篇介绍了 C 内存相关的知识。 C内存分区 在C中&#…

【python学习】numpy第三方库的定义、功能、使用场景和使用以及遇到的一些问题

引言 python学习学习到第三方库知识&#xff0c;首先学习的就是机器学习以及对应的numpy第三方库 文章目录 引言一、numpy第三方库的定义二、numpy第三方库的功能2.1数组操作2.2 线性代数计算2.3 随机数生成2.4 文件读写 三、numpy第三方库的使用场景3.1需要进行数值计算3.2 需…

PyCharm软件初始化配置

安装完pycharm后&#xff0c;需要对其进行个性化设置&#xff0c;分别设置方法如下 目录 一、修改主题二、修改默认字体和大小三、设置拖动滚轮改变字体大小四、常见快捷键 一、修改主题 1、界面右上角点击红框的内容 2、选择Theme选项 3、选择对应的主题 第一二个是白色主题…

通俗易懂多图透彻讲解二叉树的遍历--前序, 中序和后序

二叉树的遍历是一个数据结构中经常会遇到的知识点, 具体又分为前序, 中序和后序三种. 什么是树? 先来理解一下什么是树, 从一个我们相对熟悉的家谱树(Family Tree)说起吧. 家族的根是爷爷, 然后生了两个娃, 大伯和你爸爸. 继续往下, 有堂哥堂姐, 还有你以及你妹, 等等. 一个…

工业智能网关的边缘计算能力赋能工业4.0

边缘计算是将数据处理和分析能力推向网络边缘的技术&#xff0c;使得终端设备能够实时、快速地响应环境变化&#xff0c;并做出相应决策。在智能制造中&#xff0c;通过5G工业网关的边缘计算能力&#xff0c;企业可以实现对生产线上大量传感器数据的实时采集、处理和分析&#…

Linux0715

一切皆文件&#xff0c;文件IO已经学习完毕&#xff0c;这两天完成一个minishell的小项目 文件操作 1. 标准IO 具有缓冲区 是对普通文件的读写 1. fopen ----------------------------->文件流指针 FILE * …

联发科又放大招,天玑9400支持10.7Gbps LPDDR5X内存性能拉满!

三星官方消息称&#xff0c;联发科天玑9400将支持全球最快的手机内存10.7Gbps LPDDR5X&#xff01;而且数码达人科技九州君也在微博上透露&#xff0c;天玑9400将首发支持全球最快的移动DRAM。顶级的内存加上天玑9400采用的黑鹰架构和配置的大CPU缓存&#xff0c;性能直接拉满了…

基于springboot和mybatis的RealWorld后端项目实战三之添加swagger

pom.xml添加依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><arti…