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方法,这个验证过程没有发出来,大家也可以自行验证。

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

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

相关文章

助力618-Y的混沌实践之路 | 京东云技术团队

一、写在前面 1、混沌是什么&#xff1f; 混沌工程&#xff08;Chaos Engineering&#xff09;的概念由 Netflix 在 2010 年提出&#xff0c;通过主动向系统中引入异常状态&#xff0c;并根据系统在各种压力下的行为表现确定优化策略&#xff0c;是保障系统稳定性的新型手段。…

CS 144 Lab Six -- building an IP router

CS 144 Lab Six -- building an IP router 引言路由器的实现测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Six 对应的PDF: Lab Checkpoint 5: building an IP router 引言 在本实验中&#xff0c;你将在现有的NetworkInterface基础上实现一个IP路由器&#xf…

Linux知识点 -- 进程间通信(二)

Linux知识点 – 进程间通信&#xff08;二&#xff09; 文章目录 Linux知识点 -- 进程间通信&#xff08;二&#xff09;一、System V共享内存1.原理2.申请共享内存3.System V共享内存的使用4.为共享内存添加访问控制 二、信号量&#xff08;概念理解&#xff09;1.概念2.信号量…

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 链接: https://pan.baidu.com/s/1PZ6w5NcSOuKusBTNa3Ng2g?pwd79wr 提取码: 79wr 模板匹配文件 …

Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart

文章目录 为什么要将程序配置成服务&#xff1f;1. 自动启动2. 后台运行3. 定时重启4. 简化管理5. 整合系统 版本支持1. Ubuntu 14.04及更早版本&#xff1a;使用upstart作为默认的init系统/etc/rc.local旧版本新版本 2. Ubuntu 15.04到16.04版本&#xff1a;默认使用systemd作…

【敏捷开发】测试驱动开发(TDD)

测试驱动开发&#xff08;Test-Driven Development&#xff0c;简称TDD&#xff09;是敏捷开发模式中的一项核心实践和技术&#xff0c;也是一种设计方法论。TDD有别于以往的“先编码&#xff0c;后测试”的开发模式&#xff0c;要求在设计与编码之前&#xff0c;先编写测试脚本…

1310. 数三角形

题目链接&#xff1a;https://www.acwing.com/problem/content/1312/ 首先不考虑三点共线的情况一共有 种&#xff0c;现在来计算三点共线的情况 1.三点在一条直线上 2.三点在一条竖线上 3.三点在一条斜线上&#xff0c;正反斜线对称&#xff0c;仅需考虑一边的情况 如果…

docker安装mysql

安装mysql docker pull mysql:8.0.31 单机启动&#xff1a; docker run -itd --name mysql1 -p 3305:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:8.0.31 --lower_case_table_names1 单机指定配置文件启动&#xff1a; docker run \ --name mysql-8 \ -d \ -p 3306:3306 …

14-5_Qt 5.9 C++开发指南_基于HTTP 协议的网络应用程序

文章目录 1. 实现高层网络操作的类2. 基于HTTP协议的网络文件下载3.源码3.1 可是化UI设计3.2 mainwindow.h3.3 mainwindow.cpp 1. 实现高层网络操作的类 Qt 网络模块提供一些类实现 OSI 7 层网络模型中高层的网络协议&#xff0c;如 HTTP、FTP、SNMP等&#xff0c;这些类主要是…

Netty使用和常用组件辨析

Netty 使用和常用组件 简述 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId <version>4.1.42.Final </version> <scope>compile</scope> </dependency> Netty 的优势 1 、 AP…

【小吉带你学Git】idea操作(2)_版本和分支的相关操作

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;版本⭐首先创建一个项目⭐添加暂存区⭐提交本地库&#x1f33…

压力测试与测试工具jmeter的介绍

目录 一、性能指标 二、jmeter &#xff08;一&#xff09;JMeter 安装 &#xff08;二&#xff09;JMeter 压测示例 1、添加线程组 2、添加 HTTP 请求 3、添加监听器 4、启动压测&查看分析结果 &#xff08;三&#xff09;JMeter Address Already in use 错误解决 压力测…

yum出现Could not retrieve mirrorlist解决方法

Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release6&archi386&repoos error was 14: PYCURL ERROR 6 - “Couldn’t resolve host ‘mirrorlist.centos.org…

monaco,monaco-editor,monaco-editor-webpack-plugin,

Monaco "Monaco"是包含了Monaco Editor和Monaco Language Server两个项目的总称&#xff0c;而"Monaco Editor"是Monaco项目中的一个部分&#xff0c;它是一款基于Web技术的高性能代码编辑器。 Monaco Language Server是一个支持多种语言的语言服务器&am…

【web逆向】全报文加密及其登录流程的分析案例

aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应&#xff1a; 全局搜索加密字段jsondata&#xff0c;这种非特定参数的一般一搜一个准&#xff0c;搜到就是断点。起初下的断点没停住&#xff0c;转而从调用栈单步…

HJ52 计算字符串的编辑距离

题目&#xff1a;HJ52 计算字符串的编辑距离 题解&#xff1a; 定义dp方程&#xff0c;dp[i][j] 表示字符串s1(1-i)&#xff0c;到字符串s2(1-j)的编辑距离&#xff1b; 如果s1[i] s2[j] 证明当前位置的字符相等&#xff0c;无需操作&#xff0c;即dp[i][j] dp[i-1][j-1]; …

K8S系列文章之 kubeasz部署K8S环境

自动化安装方式&#xff08;kubeasz&#xff09;* 生产环境推荐&#xff08;首次安装下载相关配置和安装包&#xff09;是基于Ansible实现的部署工具 简单介绍 每一具体k8s集群的详细配置参数文件 Ansible 任务配置文件 镜像安装包 安装部署步骤 前提 &#xff1a; 保证Ansib…

Python web实战之 Django 的模板语言详解

关键词&#xff1a; Python、web开发、Django、模板语言 概要 作为 Python Web 开发的框架之一&#xff0c;Django 提供了一套完整的 MVC 模式&#xff0c;其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。 1. Django 模板语言入门 Dj…

npm发布包

1.npm 登录 在控制台输入命令 npm login 按提示输入用户名&#xff0c;密码&#xff0c;邮箱后登录 如果出现如下提示 需要将淘宝镜像源切换为npm源&#xff0c;删除或注释以下内容就行 2.发布 进入准备发布的代码的根目录下&#xff0c;输入命令 npm publish 3.删除已发…

PostgreSql pg_ctl 命令

一、概述 控制 PostgreSQL 服务的工具。 二、语法 --初始化数据库实例 pg_ctl init[db] [-D datadir] [-s] [-o initdb-options]--启动数据库实例 pg_ctl start [-D datadir] [-l filename] [-W] [-t seconds] [-s] [-o options] [-p path] [-c]--停止数据库实例 pg_ctl sto…