序列化性能测试: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. ...
随机推荐
- Modbus转Profinet网关改写变频器运行状态在1200PLC程序控制实例
兴达易控Modbus转Profinet网关将丹佛斯变频器接入西门子 1200PLC 配置案例 案例简介: 本案例是兴达易控Modbus转Profinet网关连接丹佛斯变频器在西门子 1200PLC程序 ...
- 基于react18+vite4+arco.design搭建极简版后台管理模板
趁着国庆前夕整了一个vite4结合react18搭建后台管理模板,搭配上字节团队react组件库ArcoDesign,整体操作功能非常丝滑.目前功能支持多种模板布局.暗黑/亮色模式.国际化.权限验证. ...
- 文章《Semantic Kernel —— LangChain 的替代品?》的错误和疑问 探讨
微信公众号文章 Semantic Kernel -- LangChain 的替代品?[1] ,它使用的示例代码是Python ,他却发了这么一个疑问: 支持的语言对比(因为 Semantic Kern ...
- 其它——ZeroRPC和SimpleXMLRPCServer
文章目录 一 Python中RPC框架 二 SimpleXMLRPCServer使用 服务端 客户端 三 ZeroRPC使用 服务端 客户端 一 Python中RPC框架 自带的:SimpleXMLR ...
- Python基础概要(一天快速入门)
文章目录 一 编程与编程语言 二 编程语言分类 三 主流编程语言介绍 四 Python介绍 五 安装python解释器 六 第一个python程序 七 变量 八 用户与程序交互 九 基本数据类型 十 ...
- Python+Softmax+MNIST
# -*- coding: utf-8 -*- """ 用神经网络搭建的softmax线性分离器 Softmax是用于分类过程,用来实现多分类的,简单来说,它把一些输出的 ...
- 通过Lambda函数的方式获取属性名称
前言: 最近在使用mybatis-plus框架, 常常会使用lambda的方法引用获取实体属性, 避免出现大量的魔法值. public List<User> listBySex() { L ...
- 语雀崩了,免费送VIP6个月,赶紧薅!!
一.前言 在一个无聊的周一,下午浑浑噩噩的时候,一条公众号信息引起我的关注. 什么东西?语雀这种量级的产品也能崩? 看了一下还真是官方公众号发的!! 心里不由得出现,完蛋整个团队要打包遣散了. 其实小 ...
- SQL Server事务及隔离级别
事务的并发操作可能出现的问题 中文 英文 描述 脏读 Dirty Reads 事务2读到了事务1未提交的事务,事务1随后回滚,但事务2读到了事务1的"中间数据". 在Read Un ...
- 二进制枚举&爆搜DFS
给定一个如下图所示的全圆量角器. 初始时,量角器上的指针指向刻度 0. 现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针) ...