序列化性能测试: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固态
jdk8fastjson 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的更多相关文章

  1. Spring RedisTemplate操作-序列化性能测试(12)

    @Autowired @Qualifier("redisTemplate") private RedisTemplate<String, String> stringr ...

  2. jackson、fastjson、kryo、protostuff等序列化工具性能对比

    简介 实际项目中,我们经常需要使用序列化工具来存储和传输对象.目前用得比较多的序列化工具有:jackson.fastjson.kryo.protostuff.fst 等,本文将简单对比这几款工具序列化 ...

  3. JAVA基础4---序列化和反序列化深入整理(JDK序列化)

    一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...

  4. fastJson使用

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,由阿里巴巴的工程师开发. 主要特点: 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson ...

  5. FastJson的简单实用

    一.FastJson的理解 在工作中,经常客服端需要和服务端进行通信,目前很多项目都采用JSON的方式进行数据传输,简单的参数可以通过手动拼接JSON字符串,但如果请求的参数过多,采用手动拼接JSON ...

  6. Fastjson介绍

    简单介绍 Fastjson是一个Java语言编写的高性能功能完好的JSON库. 高性能 fastjson採用独创的算法,将parse的速度提升到极致,超过全部json库,包含以前号称最快的jackso ...

  7. fastjson初始化对性能的影响(转)

    之前在项目中序列化是用thrift,性能一般,而且需要用编译器生成新的类,在序列化和反序列化的时候感觉很繁琐,因此想转到json阵营.对比了jackson,gson等框架之后,决定用fastjson, ...

  8. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  9. Json解析教程(四.FastJson 的使用)

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  10. Fastjson 的简单使用<转>

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

随机推荐

  1. Modbus转Profinet网关改写变频器运行状态在1200PLC程序控制实例

    兴达易控Modbus转Profinet网关将丹佛斯变频器接入西门子 1200PLC 配置案例 案例简介: 本案例是兴达易控Modbus转Profinet网关连接丹佛斯变频器在西门子 1200PLC程序 ...

  2. 基于react18+vite4+arco.design搭建极简版后台管理模板

    趁着国庆前夕整了一个vite4结合react18搭建后台管理模板,搭配上字节团队react组件库ArcoDesign,整体操作功能非常丝滑.目前功能支持多种模板布局.暗黑/亮色模式.国际化.权限验证. ...

  3. 文章《Semantic Kernel &mdash;&mdash; LangChain 的替代品?》的错误和疑问 探讨

    微信公众号文章 Semantic Kernel -- LangChain 的替代品?[1] ,它使用的示例代码是Python ,他却发了这么一个疑问: 支持的语言对比(因为 Semantic Kern ...

  4. 其它——ZeroRPC和SimpleXMLRPCServer

    文章目录 一 Python中RPC框架 二 SimpleXMLRPCServer使用 服务端 客户端 三 ZeroRPC使用 服务端 客户端 一 Python中RPC框架 自带的:SimpleXMLR ...

  5. Python基础概要(一天快速入门)

    文章目录 一 编程与编程语言 二 编程语言分类 三 主流编程语言介绍 四 Python介绍 五 安装python解释器 六 第一个python程序 七 变量 八 用户与程序交互 九 基本数据类型 十 ...

  6. Python+Softmax+MNIST

    # -*- coding: utf-8 -*- """ 用神经网络搭建的softmax线性分离器 Softmax是用于分类过程,用来实现多分类的,简单来说,它把一些输出的 ...

  7. 通过Lambda函数的方式获取属性名称

    前言: 最近在使用mybatis-plus框架, 常常会使用lambda的方法引用获取实体属性, 避免出现大量的魔法值. public List<User> listBySex() { L ...

  8. 语雀崩了,免费送VIP6个月,赶紧薅!!

    一.前言 在一个无聊的周一,下午浑浑噩噩的时候,一条公众号信息引起我的关注. 什么东西?语雀这种量级的产品也能崩? 看了一下还真是官方公众号发的!! 心里不由得出现,完蛋整个团队要打包遣散了. 其实小 ...

  9. SQL Server事务及隔离级别

    事务的并发操作可能出现的问题 中文 英文 描述 脏读 Dirty Reads 事务2读到了事务1未提交的事务,事务1随后回滚,但事务2读到了事务1的"中间数据". 在Read Un ...

  10. 二进制枚举&爆搜DFS

    给定一个如下图所示的全圆量角器. 初始时,量角器上的指针指向刻度 0. 现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针) ...