序列化性能测试:jdk和fastjson
序列化性能测试:jdk和fastjson
我开发一个认证授权框架时,需要添加数据库存储token或者会话,于是想测试使用jdk的blob存储解析快还是存储string的json序列化解析快,从而选择他们其中一个。
1、数据库存储json快
2、数据库存储二进制数据库
我的开源框架:
分布式会话:https://gitee.com/lingkang_top/final-session
授权认证: https://gitee.com/lingkang_top/final-security
我的电脑配置,
AMD Ryzen 5 3600 6-Core Processor 3.59 GHz 6核12线程
32G=金士顿DDR4 16G*2 三星 1T固态、金士顿 1T固态
jdk8、fastjson 1.2.72 mysql 5.7.34
验证方式,一个普通springboot项目,启动后执行序列化写入、读取反序列化。
结论
我用脚投票了,选择fastjson序列化与反序列化,因为大家性能差不多,json领先不明显,但是json很直观看到数据。
写入
json
/**
* 1w,写入耗时:10974
* 1w,写入耗时:10849
* 1w,写入耗时:10759
* 1k,写入耗时:1224
* 1k,写入耗时:1099
* 1k,写入耗时:1093
* 1k,写入耗时:1075
* 1k,写入耗时:1101
*/
洗个澡出来测试写入10w,3次写入,后面两次变为了进5分钟,应该是缓存用满。
10w,写入耗时:151796
10w,写入耗时:284473
10w,写入耗时:284109
jdk序列化
/**
* 1w,写入耗时:11136
* 1w,写入耗时:11002
* 1w,写入耗时:11009
* 1k,写入耗时:1175
* 1k,写入耗时:1109
* 1k,写入耗时:1108
* 1k,写入耗时:1087
* 1k,写入耗时:1096
*/
测试写入10w,3次写入,后面两次变为了进5分钟,应该是缓存用满。
10w,写入耗时:159640
10w,写入耗时:286590
10w,写入耗时:289706
读取
json
/**
* 1w,读取耗时:1501
* 1w,读取耗时:1373
* 1w,读取耗时:1345
* 1w,读取耗时:1347
* 1w,读取耗时:1350
* 10w,读取耗时:13137
* 10w,读取耗时:13064
* 10w,读取耗时:13111
* 10w,读取耗时:13151
* 10w,读取耗时:13094
*/
jdk序列化
/**
* 1w,读取耗时:1738
* 1w,读取耗时:1553
* 1w,读取耗时:1561
* 1w,读取耗时:1565
* 1w,读取耗时:1565
* 10w,读取耗时:14954
* 10w,读取耗时:14728
* 10w,读取耗时:14817
* 10w,读取耗时:14679
* 10w,读取耗时:14722
*/
实体类
public class TokenDetails implements Serializable {
private String token;
private String username;
private Set<String> role;
// get set
}
jdk序列化工具
import java.io.*;
/**
* @author lingkang
* Created by 2022/1/27
* 序列化反序列化工具
*/
public class SerializationUtils {
public static byte[] serialization(Object source) throws IOException {
ByteArrayOutputStream bytes = null;
try {
bytes = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bytes);
oos.writeObject(source);
oos.close();
return bytes.toByteArray();
} catch (IOException e) {
throw e;
} finally {
if (bytes != null)
bytes.close();
}
}
public static Object unSerialization(InputStream in) throws IOException, ClassNotFoundException {
try {
ObjectInputStream objectInputStream = new ObjectInputStream(in);
return objectInputStream.readObject();
} catch (Exception e) {
throw e;
}
}
}
操作类
@RestController
public class WebController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("")
public Object index() throws Exception {
long start = System.currentTimeMillis();
json();
// jdkSer();
long time = System.currentTimeMillis() - start;
System.out.println("1k,写入耗时:" + time);
return time;
}
@GetMapping("/read")
public Object read() throws Exception {
long start = System.currentTimeMillis();
readJson();
// readSer();
long time = System.currentTimeMillis() - start;
System.out.println("10w,读取耗时:" + time);
return time;
}
/**
* 1w,写入耗时:10974
* 1w,写入耗时:10849
* 1w,写入耗时:10759
* 1k,写入耗时:1224
* 1k,写入耗时:1099
* 1k,写入耗时:1093
* 1k,写入耗时:1075
* 1k,写入耗时:1101
*/
private void json() {
HashSet<String> role = new HashSet<>();
role.add("user");
role.add("admin");
for (int i = 0; i < 1000; i++) {
String token = UUID.randomUUID().toString();
TokenDetails details = new TokenDetails();
details.setToken(token);
details.setRole(role);
details.setUsername("username-" + i);
jdbcTemplate.update("insert into test_json values(?,?)",
token, JSONObject.toJSONString(details)
);
}
}
/**
* 1w,写入耗时:11136
* 1w,写入耗时:11002
* 1w,写入耗时:11009
* 1k,写入耗时:1175
* 1k,写入耗时:1109
* 1k,写入耗时:1108
* 1k,写入耗时:1087
* 1k,写入耗时:1096
*/
private void jdkSer() throws IOException {
HashSet<String> role = new HashSet<>();
role.add("user");
role.add("admin");
for (int i = 0; i < 1000; i++) {
String token = UUID.randomUUID().toString();
TokenDetails details = new TokenDetails();
details.setToken(token);
details.setRole(role);
details.setUsername("username-" + i);
byte[] serialization = SerializationUtils.serialization(details);
jdbcTemplate.update("insert into test_ser values(?,?)", token, serialization);
}
}
/**
* 1w,读取耗时:1501
* 1w,读取耗时:1373
* 1w,读取耗时:1345
* 1w,读取耗时:1347
* 1w,读取耗时:1350
* 10w,读取耗时:13137
* 10w,读取耗时:13064
* 10w,读取耗时:13111
* 10w,读取耗时:13151
* 10w,读取耗时:13094
*/
private void readJson() {
for (int i = 0; i < 100000; i++) {
String token = "08915ec0-0ec6-44b3-8c21-c68c73edd068";
String details = jdbcTemplate.queryForObject("select content from test_json where id=?",
new Object[]{token},
String.class
);
TokenDetails details1 = JSONObject.parseObject(details, TokenDetails.class);
details1.getRole();
}
}
/**
* 1w,读取耗时:1738
* 1w,读取耗时:1553
* 1w,读取耗时:1561
* 1w,读取耗时:1565
* 1w,读取耗时:1565
* 10w,读取耗时:14954
* 10w,读取耗时:14728
* 10w,读取耗时:14817
* 10w,读取耗时:14679
* 10w,读取耗时:14722
*/
private void readSer() throws Exception {
for (int i = 0; i < 100000; i++) {
String token = "08fafa73-9ede-4c86-8175-8ab78c5f87bf";
Blob blob = jdbcTemplate.queryForObject("select content from test_ser where id=?",
new String[]{token}, Blob.class);
TokenDetails details = (TokenDetails) SerializationUtils.unSerialization(blob.getBinaryStream());
details.getRole();
}
}
}
建表语句
CREATE TABLE `test_json` (
`id` varchar(225) NOT NULL,
`content` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `test_ser` (
`id` varchar(225) NOT NULL,
`content` blob,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
序列化性能测试:jdk和fastjson的更多相关文章
- Spring RedisTemplate操作-序列化性能测试(12)
@Autowired @Qualifier("redisTemplate") private RedisTemplate<String, String> stringr ...
- jackson、fastjson、kryo、protostuff等序列化工具性能对比
简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...
- JAVA基础4---序列化和反序列化深入整理(JDK序列化)
一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...
- fastJson使用
fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,由阿里巴巴的工程师开发. 主要特点: 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson ...
- FastJson的简单实用
一.FastJson的理解 在工作中,经常客服端需要和服务端进行通信,目前很多项目都采用JSON的方式进行数据传输,简单的参数可以通过手动拼接JSON字符串,但如果请求的参数过多,采用手动拼接JSON ...
- Fastjson介绍
简单介绍 Fastjson是一个Java语言编写的高性能功能完好的JSON库. 高性能 fastjson採用独创的算法,将parse的速度提升到极致,超过全部json库,包含以前号称最快的jackso ...
- fastjson初始化对性能的影响(转)
之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营.对比了jackson,gson等框架之后,决定用fastjson, ...
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- Json解析教程(四.FastJson 的使用)
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- Fastjson 的简单使用<转>
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
随机推荐
- Redis和Memcache区别,优缺点对比(转)
转自 https://www.cnblogs.com/JavaBlackHole/p/7726195.html 1. Redis和Memcache都是将数据存放在内存中,都是内存数据库.不过memca ...
- ERP 财务管理的应付帐款流程
导读:应付帐款流程与应收帐款流程是财务管理的开端,也是财务工作的主要流程.若能够这两大流程控制好了,ERP系统的财务模块也就成功了一大半了.我先讲一下财务管理的应付帐款流程. 企业的应付帐款有很多种类 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(10) -- 在DataGrid上直接编辑保存数据
有时候,一些数据的录入可能需要使用表格直接录入会显得更加方便快捷,这种情况有时候也是由于客户使用习惯而提出,本篇随笔介绍在WPF应用端上使用DataGrid来直接新增.编辑.保存数据的处理. 录入数据 ...
- calico网络异常,不健康
解决calico/node is not ready: BIRD is not ready: BGP not established withxxx calico有一个没有ready,查了一下是没有发 ...
- 码编译安装nginx
1.解释源码安装nginx软件的预编译,编译以及安装,分别是在做什么,需要注意什么? 预编译(configure): ./configure 00prefix=/usr/local/nginx --u ...
- 洛谷P1144
最短路计数 题目描述 给出一个 \(N\) 个顶点 \(M\) 条边的无向无权图,顶点编号为 \(1\sim N\).问从顶点 \(1\) 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 \ ...
- 使用 Jenkins + Github + dokcer-compose 部署项目-实战篇
使用 Jenkins + Github + dokcer-compose 部署项目-实战篇 需要声明的一点是,此处实现的项目自动构建原理是 Github+Jenkins 的 webhook,因此得保证 ...
- C/C++ __builtin 超实用位运算函数总结
以 __builtin 开头的函数,是一种相当神奇的位运算函数,下面本人盘点了一下这些以 __builtin 开头的函数,希望可以帮到大家. 1 __builtin_ctz( ) / __buitli ...
- webgoat _v8.1全流程通关
1.1 (A1)SQL Injection (intro) 概念 本课程介绍了什么是结构化查询语言(SQL),以及如何操纵它以执行开发人员原始意图之外的任务. 目标 用户将对SQL的工作原理和用途有基 ...
- 栈与队列应用:逆波兰计算器(逆波兰表达式;后缀表达式)把运算符放到运算量后边 && 中缀表达式转化为后缀表达式
1 //1.实现对逆波兰输入的表达式进行计算如(2-1)*(2+3)= 5 就输入2 1 - 2 3 + * //先把2 1 压栈 遇到-弹栈 再把2 3压进去 遇到+弹栈 最后遇到*弹栈 2 //2 ...