java之jmh初识及使用
最近有场景需要数据支撑json的toJsonString方法和java原生的toString方法的运行速度,因此选用了JMH测试工具。
以下代码大致意思是:初始化一个list集合,放入100个对象,然后遍历这个集合,调用fastjson的toJsonString方法和对象的toString方法。
这100个对象属性值拼接了list的下标,防止字符串常量池中存在相同的字符。
实体类代码:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestDto {private Integer id;private String name;private String address;private Date date;private boolean aBoolean;private double aDouble;private float aFloat;}
jmh测试代码如下:
import com.alibaba.fastjson.JSON;
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 org.openjdk.jmh.runner.options.TimeValue;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread)
public class JmhTest {private List<TestDto> list;/*** 初始化准备工作*/@Setup(Level.Iteration)public void setUp() {this.list = new ArrayList<>();for (int i = 0; i < 100; i++) {TestDto testDto = TestDto.builder().id(i).name("xiaoming" + i).address("beijing" + i).date(new Date()).aDouble(i).aBoolean(true).aFloat(i).build();list.add(testDto);}}/*** 方法1*/@Benchmarkpublic void toJSONStringTest() {for (TestDto testDto : list) {String res = JSON.toJSONString(testDto);}}/*** 方法2*/@Benchmarkpublic void toStringTest() {for (TestDto testDto : list) {String res = testDto.toString();}}public static void main(String[] args) throws RunnerException {final Options opts = new OptionsBuilder().include(JmhTest.class.getSimpleName()).forks(1)// 多少次测量迭代.measurementIterations(10)// 每次测量迭代需要多长时间.measurementTime(TimeValue.microseconds(1000000L))// 进行多少次预热迭代.warmupIterations(1)// 每次预热迭代需要多长时间.warmupTime(TimeValue.microseconds(1000000L)).build();new Runner(opts).run();}
}
运行结果如下:
# JMH version: 1.19
# VM version: JDK 1.8.0_282, VM 25.282-b08
# VM invoker: D:\corretto-1.8.0_282\jre\bin\java.exe
# VM options: -javaagent:D:\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=56086:D:\IntelliJ IDEA 2020.3.3\bin -Dfile.encoding=UTF-8
# Warmup: 1 iterations, 1000000 us each
# Measurement: 10 iterations, 1000000 us each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: com.honor.wpshowdemo.serverone.test.JmhTest.toJSONStringTest# Run progress: 0.00% complete, ETA 00:00:22
# Fork: 1 of 1
# Warmup Iteration 1: 977.533 us/op
Iteration 1: 66.566 us/op
Iteration 2: 61.137 us/op
Iteration 3: 66.597 us/op
Iteration 4: 54.270 us/op
Iteration 5: 54.927 us/op
Iteration 6: 53.950 us/op
Iteration 7: 54.212 us/op
Iteration 8: 54.328 us/op
Iteration 9: 54.574 us/op
Iteration 10: 54.343 us/opResult "com.honor.wpshowdemo.serverone.test.JmhTest.toJSONStringTest":57.490 ±(99.9%) 7.924 us/op [Average](min, avg, max) = (53.950, 57.490, 66.597), stdev = 5.241CI (99.9%): [49.566, 65.414] (assumes normal distribution)# JMH version: 1.19
# VM version: JDK 1.8.0_282, VM 25.282-b08
# VM invoker: D:\corretto-1.8.0_282\jre\bin\java.exe
# VM options: -javaagent:D:\IntelliJ IDEA 2020.3.3\lib\idea_rt.jar=56086:D:\IntelliJ IDEA 2020.3.3\bin -Dfile.encoding=UTF-8
# Warmup: 1 iterations, 1000000 us each
# Measurement: 10 iterations, 1000000 us each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: com.honor.wpshowdemo.serverone.test.JmhTest.toStringTest# Run progress: 50.00% complete, ETA 00:00:13
# Fork: 1 of 1
# Warmup Iteration 1: 105.282 us/op
Iteration 1: 80.594 us/op
Iteration 2: 64.168 us/op
Iteration 3: 63.157 us/op
Iteration 4: 63.548 us/op
Iteration 5: 63.345 us/op
Iteration 6: 64.605 us/op
Iteration 7: 63.592 us/op
Iteration 8: 63.363 us/op
Iteration 9: 64.166 us/op
Iteration 10: 63.580 us/opResult "com.honor.wpshowdemo.serverone.test.JmhTest.toStringTest":65.412 ±(99.9%) 8.094 us/op [Average](min, avg, max) = (63.157, 65.412, 80.594), stdev = 5.353CI (99.9%): [57.318, 73.505] (assumes normal distribution)# Run complete. Total time: 00:00:25Benchmark Mode Cnt Score Error Units
JmhTest.toJSONStringTest avgt 10 57.490 ± 7.924 us/op
JmhTest.toStringTest avgt 10 65.412 ± 8.094 us/opProcess finished with exit code 0
结论如下:
对象属性只有7个的时候,fastjson的toJsonString方法明显优于对像的toString方法。
ps:
不过,当对象属性更少时,toString方法是优于toJosnString方法,这个验证过程没有发出来,大家也可以自行验证。
相关文章:
java之jmh初识及使用
最近有场景需要数据支撑json的toJsonString方法和java原生的toString方法的运行速度,因此选用了JMH测试工具。 以下代码大致意思是:初始化一个list集合,放入100个对象,然后遍历这个集合,调用fastjson的toJsonString方…...

利用状态监测和机器学习提高冷却塔性能的具体方法
在现代工业生产中,冷却塔扮演着至关重要的角色,它们的性能直接影响着工艺流程的稳定性和效率。为了确保冷却塔的正常运行和减少系统故障,状态监测和机器学习成为了关键技术。 图.冷却塔(PreMaint) 在前文《基于人工智…...
LeetCode_02_1289. 下降路径最小和 II
1289. 下降路径最小和 II 给你一个 n x n 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为:从 grid 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。 示…...
consul servicecheck 查看健康信息
在浏览器中地址栏输入如下信息:http://localhost:8500/v1/agent/checks 返回信息如下: { "service:springboot-security-oauth2-zuul-sso-server-1881": { "Node": "8DBQ2F05HUXZ2QO", "Check…...

什么是信息孤岛?如何打破信息孤岛?
一文让你看懂:什么是信息孤岛?信息孤岛形成的原因?以及如何打破信息孤岛? 本文重点结合了企业信息系统的需求,给出了整合企业现有信息系统的方法,能有效解决企业信息孤岛的问题,并帮助企业快速…...

Android开源 Skeleton 骨架屏
目录 一、简介 二、效果图 三、引用 Skeleton 添加jitpack 仓库 添加依赖: 四、使用 Skeleton 1、VIew 骨架屏使用 ViewSkeletonScreen 2、列表类View 骨架屏 RecyclerViewSkeletonScreen、GridViewSkeletonScreen、 ListViewSkeletonScreen 一、简介 骨架屏的作用是…...

都说IT就业难?到底难在哪?
现在网上关于IT行业,劝退的帖子真的很多,很多人看了后无比焦虑,没入行的,还没开始学,就担心找不到工作了;在行业内的,想跳槽的也纷纷开始摆烂,觉得市场根本没啥机会,简历…...

STM32芯片的内部架构介绍
STM32芯片由内核和片上外设两部分组成。STM32F103采用Cortex-M3内核,该内核由ARM公司设计。芯片生产厂商ST则负责在内核之外设计部件并生产整个芯片。这些内核之外的部件被称为核外外设或片上外设,如GPIO、USART(串口)、I2C、SPI等…...
Angular FormControl value属性的一些事
背景:一个输入校验,允许输入多行,每一行是ip或网段。写了个校验,将其按行拆分后单独校验。 1. FormControl无法深复制 使用JSON.parse(JSON.stringify(control))进行简单深复制报错,因为不是json类型;使用d…...
Nim游戏:取石头
(一)一堆取石头 背景: 在博弈论中,有一种称为Nim游戏的经典问题,它涉及到取石子的问题,其中有许多变种。Nim游戏是一种零和博弈,即两名玩家交替行动,每次只能从一堆物品中取走一定数…...

springboot国际化
springboot国际化 不需要引入额外的jar包 参考:https://zhuanlan.zhihu.com/p/551605839 1.rources要创建Resource Bundle 2.yml配置中引入Resource Bundle 引入Resource Bundle spring:messages:encoding: UTF-8basename: i18n/messages_common3.创建国际化工具…...
12种不宜使用的Javascript语法
1. Javascript有两组相等运算符,一组是和!,另一组是和!。前者只比较值的相等,后者除了值以外,还比较类型是否相同。 请尽量不要使用前一组,永远只使用和!。因为默认会进行类型转换,规则十分难记。如果你…...

vue3+element-plus点击列表中的图片预览时,图片被表格覆盖
文章目录 问题解决 问题 视觉 点击图片进行预览,但还能继续选中其他的图片进行预览,鼠标放在表格上,那一行表格也会选中,如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…...

flutter:二维码生成与读取
前言 这csdn真的是服了,图片里有个二维码就直接变成违规图片了。至于效果的话,自己运行一下看看吧。 生成 flutter中生成二维码可以使用 qr_flutter。 官方文档 https://pub-web.flutter-io.cn/packages/qr_flutter 安装 flutter pub add qr_flutt…...
Camunda 7.x 系列【14】核心概念
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 流程定义1.1 Key1.2 版本1.3 挂起2. 流程实例3. 执行4. 活动实例5. 作业和作业定义本篇文…...

matplotlib 笔记:hist2d 2D直方图
创建二维直方图,用于显示数据分布的图表将数据划分成不同的区间(bin),并统计每个区间内数据点的数量 1 基本画法 默认bin的数量是10*10 N 1000 x np.random.randn(N) y np.random.randn(N) plt.hist2d(x, y) 2 修改bin的…...

数据库优化脚本执行报错
目录 一、执行数据库优化脚本 报错... 3 解决方法:... 4 1、直接注释掉RECYCLE_POOLS 赋值sql语句块... 4 2、手动修改脚本... 5 附录... 6 一、执行数据库优化脚本 报错 AutoParaAdj3.5_dm8.sql 1)manager中报错 -20001: 执行失败, -7065 数据未…...
TopN漏洞--sql注入
sql注入 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查…...

【论文阅读】UNICORN:基于运行时来源的高级持续威胁检测器(NDSS-2020)
UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats NDSS-2020 哈佛大学 Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020. 源码&…...
Linux的基本介绍和常用命令
Linux和Windows的主要区别 Linux和Windows是两种具有不同特性的操作系统,它们具有各自的优点和适用场景。选择哪一个操作系统主要取决于用户的需求、技术背景及使用场景等。 Linux和Windows的主要区别如下: 开源VS闭源:Linux是开源的系统&…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

C++中vector类型的介绍和使用
文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...