简介

最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:

专门针对Java语言的:Kryo,FST等等

跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等

这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化)。有鉴于此,我们为dubbo引入Kryo和FST这 两种高效Java序列化实现,来逐步取代hessian2。其中,Kryo是一种非常成熟的序列化实现,已经在Twitter、Groupon、 Yahoo以及多个著名开源项目(如Hive、Storm)中广泛的使用。而FST是一种较新的序列化实现,目前还缺乏足够多的成熟使用案例,但它还是非 常有前途的,下面我们比较下,java原生序列化Kryo序列化性能比较

1、实体类 Simple.java

packagebhz.entity;importjava.io.Serializable;importjava.util.Map;public class Simple implementsSerializable

{private static final long serialVersionUID = -4914434736682797743L;privateString name;private intage;private Mapmap;publicSimple(){

}public Simple(String name,int age,Mapmap){this.name =name;this.age =age;this.map =map;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}public MapgetMap() {returnmap;

}public void setMap(Mapmap) {this.map =map;

}

}

2、java原生序列化 OriginalSerializable.java

packagebhz.test;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.util.HashMap;importjava.util.Map;importbhz.entity.Simple;public classOriginalSerializable {public static void main(String[] args) throwsIOException, ClassNotFoundException {long start =System.currentTimeMillis();

setSerializableObject();

System.out.println("java原生序列化时间:" + (System.currentTimeMillis() - start) + " ms" );start=System.currentTimeMillis();

getSerializableObject();

System.out.println("java原生反序列化时间:" + (System.currentTimeMillis() - start) + " ms");}public static void setSerializableObject() throwsIOException{

FileOutputStream fo= new FileOutputStream("D:/file2.bin");

ObjectOutputStream so= newObjectOutputStream(fo);for (int i = 0; i < 100000; i++) {

Map map = new HashMap(2);

map.put("zhang0", i);

map.put("zhang1", i);

so.writeObject(new Simple("zhang"+i,(i+1),map));

}

so.flush();

so.close();

}public static voidgetSerializableObject(){

FileInputStream fi;try{

fi= new FileInputStream("D:/file2.bin");

ObjectInputStream si= newObjectInputStream(fi);

Simple simple=null;while((simple=(Simple)si.readObject()) != null){//System.out.println(simple.getAge() + " " + simple.getName());

}

fi.close();

si.close();

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {//e.printStackTrace();

} catch(ClassNotFoundException e) {

e.printStackTrace();

}

}

}

3、kyro序列化 KyroSerializable.java

packagebhz.test;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importorg.objenesis.strategy.StdInstantiatorStrategy;importbhz.entity.Simple;importcom.esotericsoftware.kryo.Kryo;importcom.esotericsoftware.kryo.KryoException;importcom.esotericsoftware.kryo.io.Input;importcom.esotericsoftware.kryo.io.Output;public classKyroSerializable {public static void main(String[] args) throwsIOException {long start =System.currentTimeMillis();

setSerializableObject();

System.out.println("Kryo 序列化时间:" + (System.currentTimeMillis() - start) + " ms");

start=System.currentTimeMillis();

getSerializableObject();

System.out.println("Kryo 反序列化时间:" + (System.currentTimeMillis() - start) + " ms");

}public static void setSerializableObject() throwsFileNotFoundException{

Kryo kryo= newKryo();

kryo.setReferences(false);

kryo.setRegistrationRequired(false);

kryo.setInstantiatorStrategy(newStdInstantiatorStrategy());

kryo.register(Simple.class);

Output output= new Output(new FileOutputStream("D:/file1.bin"));for (int i = 0; i < 100000; i++) {

Map map = new HashMap(2);

map.put("zhang0", i);

map.put("zhang1", i);

kryo.writeObject(output,new Simple("zhang"+i,(i+1),map));

}

output.flush();

output.close();

}public static voidgetSerializableObject(){

Kryo kryo= newKryo();

kryo.setReferences(false);

kryo.setRegistrationRequired(false);

kryo.setInstantiatorStrategy(newStdInstantiatorStrategy());

Input input;try{

input= new Input(new FileInputStream("D:/file1.bin"));

Simple simple=null;while((simple=kryo.readObject(input, Simple.class)) != null){//System.out.println(simple.getAge() + " " + simple.getName() + " " + simple.getMap().toString());

}

input.close();

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(KryoException e){

}

}

}

4、测试结果对比

java原生序列化时间:8281 ms

java原生反序列化时间:5899 ms

Kryo 序列化时间:630 ms

Kryo 反序列化时间:15 ms

经过对比,可以发现kryo是java原生序列化性能十几倍

krait和kryo_java原生序列化和Kryo序列化性能比较相关推荐

  1. krait和kryo_java原生序列化和Kryo序列化性能实例对比分析

    简介 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf,Thrift, ...

  2. avro和java原生序列化的区别,java原生序列化和Kryo序列化性能比较

    简介 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf,Thrift, ...

  3. 【java】java原生序列化和Kryo序列化性能实例对比分析

    1.美图 2.概述 最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括: 专门针对Java语言的:Kryo,FST等等 跨语言的:Protostuff,ProtoBuf, ...

  4. spark之kryo序列化及其使用

    spark之kryo序列化 spark之kryo 序列化 Spark 中使用 Kryo序列化 中文切词案例: spark之kryo 序列化 1.定义:把对象转换为字节序列的过程称为对象的序列化. 把字 ...

  5. spark之kryo 序列化

    几乎所有的资料都显示kryo 序列化方式优于java自带的序列化方式,而且在spark2.*版本中都是默认采用kryo 序列化.因此本文将做kryo 做一个测试以验证其性能. 1.先给出定义:     ...

  6. 使用Kryo的序列化方式提升Netty性能

    2019独角兽企业重金招聘Python工程师标准>>> 为什么选择Kryo? 首先,Kryo的序列化方式,在性能方面是比较好的,和Protobuf差不多,比Java原生的序列化方式快 ...

  7. 在Dubbo中使用高效的Java序列化(Kryo和FST)

    作者:沈理 文档版权: Apache 2.0许可证 署名-禁止演绎 完善中-- TODO 生成可点击的目录 目录 序列化漫谈 启用Kryo和FST 注册被序列化类 无参构造函数和Serializabl ...

  8. dubbo kryo序列化_为什么如此高效?解密kryo各个数据类型的序列化编码机制,强...

    用过dubbo的开发人员,在替换序列化时都会根据"经验"来选kryo为序列化框架,其原因是序列化协议非常高效,超过java原生序列化协议,hessian2协议,那kryo为什么高效 ...

  9. java kryo 序列化_java中的序列化方式及dubbo使用kryo序列化

    java中的序列化方式: 1. 自带序列化  ObjectInputSteam. ObjectOutStream等 2. hession2 3. json ,xml等格式 4.kryo 5.FST - ...

最新文章

  1. python 异常和弹出框
  2. CSP认证201703-4 地铁修建[C++题解]:连通路径上的最大边权最小、bfs求边权为1的最短路、二分查找
  3. win7 VS2008 不需新建工程 命令行编译lua5.1.5
  4. 查找ipa包,删除接的ipa包
  5. 2020年周数和日期对应表_2020年雅思考试报名截止日期、准考证打印日期和成绩单寄送日期...
  6. 初学Java编程经常遇到的问题,你们遇到过吗?
  7. IDEA社区版找不到tomcat
  8. 前端:HTML/06/表单,表单元素(单行文本域,单行密码域,单选按钮,复选框,下拉列表,文本区域,上传文件域,各种按钮,隐藏域,lt;caption表格标题)
  9. odoo10参考系列--视图一(列表视图)
  10. 神经网络优化(五) - 卷积网络基础
  11. 索引sql server_SQL Server索引–系列介绍
  12. JavaScript文档对象模型概述(1)
  13. K3 WISE 开发插件《SQL语句WHERE查询-范围查询/模糊查询》
  14. jQuery实现表格冻结行和列
  15. MQ,究竟如何做到削峰填谷?
  16. 职言 | 单纯做业务测试真的行得通吗?
  17. java-net-php-python-jsp网络工程师在线测试系统计算机毕业设计程序
  18. s3c2440移植Linux内核,移植Linux-3.4.2内核到S3C2440
  19. React hooks - Ref 使用实例
  20. iOS crash报告问题

热门文章

  1. java thread 匿名_Java 匿名内部类
  2. CVPR2019 Learning to Reduce Dual-level Discrepancy for Infrared-Visible Person Re-identification
  3. pytorch系统学习
  4. 关于UEdit在编辑时老是弹窗提示UEdit已启用
  5. 网络视频聊天室的开发指南
  6. C语言 统计含有中文的字符串中的字数、 字符数和行数
  7. layui内置模块(element常用元素操作)
  8. Thinkphp 表名下滑杠处理
  9. python实验七答案_python程序设计实验答案
  10. vue3开发1:在vue3项目中集成ckeditor5编辑器,自定义图片上传,图片编辑排坑(一)