序列化性能测试: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. ...
随机推荐
- ORACLE DBLink创建
在写测试脚本时,经常需要跨库取数据,SQL本身不支持跨库查找.Oracle提供DBLink链接,支持跨库操作. 1.创建DBLink Create public database link Next_ ...
- code2uml使用教程
通常的开发顺序是 先设计uml然后进行code编程. 但是很多时候我们是先看到code源码,却不知道uml关系如何. 特别是写论文的时候也是很需要的. 这个code2uml,就是辛苦搜寻到的结果,可以 ...
- 研发三维GIS系统笔记/实现wgs84投影-002
四叉树代码修改完善 原来的代码中,没有使用投影转换,直接使用的是世界坐标(单位是米), CELLQuadTree::CELLQuadTree( CELLTerrainInterface* pInter ...
- MySQL快速导入千万条数据(1)
目录 一.命令行导入方式 二.LOAD DATA导入方式 对于传统的关系数据库如oracle,在大量数据导入方面的效率,我们一般有一个大概的认知,即1分钟以内可以导入千万条数据,而对于MySQL数据库 ...
- 深入理解 python 虚拟机:GIL 源码分析——天使还是魔鬼?
深入理解 python 虚拟机:GIL 源码分析--天使还是魔鬼? 在目前的 CPython 当中一直有一个臭名昭著的问题就是 GIL (Global Interpreter Lock ),就是全局解 ...
- 14.8 Socket 一收一发通信
通常情况下我们在编写套接字通信程序时都会实现一收一发的通信模式,当客户端发送数据到服务端后,我们希望服务端处理请求后同样返回给我们一个状态值,并以此判断我们的请求是否被执行成功了,另外增加收发同步有助 ...
- Jenkins软件平台安装部署
1.Jenkins软件平台概念剖解: 基于主流的Hudson/Jenkins平台工具实现全自动网站部署.网站测试.网站回滚会大大的减轻网站部署的成本,Jenkins的前身为Hudson,Hudson主 ...
- 关于虚拟机的IP地址经常改变问题的解法
主要解法就是配置静态IP地址 首先了解一下IP和子网掩码,网关的含义:IP 是标识计算机特定地址的二进制数,子网掩码用于和IP组合划分子网;网关是将信息传送到网关进行收发 开始配置:首先打开Linux ...
- mybtis-plus 出现 Wrong namespace
今天进行项目整合,刚开始代码搬的还挺快乐的,但是到后面调试起来,头晕眼花的.记录一个基本的错误. Cause: org.apache.ibatis.builder.BuilderException: ...
- 我整理了一份Flink流计算入门教程清单(转)
好久不见! 作为技术出身的我,不太会写软文广告,今天就直接来个硬广.之前与人民邮电出版社合作的<Flink原理与实践>经过一年多时间的打磨和润色,这两天终于与大家见面了,恳请各位朋友多多支 ...