krait和kryo_java原生序列化和Kryo序列化性能比较

news/2025/2/26 13:32:43

简介

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

专门针对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原生序列化性能十几倍


http://www.niftyadmin.cn/n/675307.html

相关文章

勿把计划当论文

领导说我计划上存在一个问题。他认为&#xff0c;我的问题关键在于&#xff0c;我将整个事情&#xff0c;当作论文在分析。各个方面都有道理。可是看上去就是和实际情况没有联系起来。 我要做的计划是规划公共资源&#xff08;什么是公共资源&#xff1f;你可以认为公共资源是研…

在Dictionary中使用枚举

自从.NET Framework 2.0引入泛型之后&#xff0c;对集合的使用就开创了新的局面。首先我们不用考虑类型是否安全&#xff0c;利用泛型以及对泛型参数的约束完全可以保障这一点&#xff1b;其次&#xff0c;集合元素不 会因为频繁的Boxing和Unboxing而影响集合遍历与操作的性能。…

八大机构推荐九只潜力股

公司是北京市唯一一家集建设、经营和管理有线广播电视网络的企业&#xff0c;独家垄断了有线电视播出的渠道资源。公司作为北京市文化信息产业的龙头企业&#xff0c;是承担数字奥运、数字北京之重点信息化工程的建设主体。有线电视的数字化整体平移工作获得了政府的大力支持。…

第四章:文法中的递归以及消除方法

在介绍递归文法之前&#xff0c;首先介绍一下递归下降分析器及其原理&#xff0c;然后分析右递归是如何处理的&#xff0c;再来分析左递归和间接左递归。 递归下降分析器 自顶向下语法分析的目的是为输入串寻找最左推导&#xff0c;或者说&#xff0c;从根节点&#xff08;文…

6双栈配置实验_实验室信息管理系统LIMS管理哪些方面?

实验室的管理非常繁杂&#xff0c;因为它牵涉到的方方面面要管的地方太多。但总体来说&#xff0c;实验室管理涉及到两方面&#xff0c;一个是“物”&#xff0c;一个是“人”。1 “物”的管理实验室对于“物”的管理&#xff0c;主要包括&#xff1a;实验室的布局、实验室的仪…

【转】用JavaScript调用Workflow

将代码放到onload里面&#xff1a; ExecuteWorkflow function(entityId, workflowId) { var xml "" "<?xml version\"1.0\" encoding\"utf-8\"?>" "<soap:Envelope xmlns:soap\"http://schema…

6位二进制转为bcd 卡诺图_请查收这份quot;位运算quot;的装逼指南

运算可谓是与编程息息相关&#xff0c;我们编写的每一个程序可能都带有加减乘除&#xff0c;当然这是最基础的运算了。在大一下的时候学了第一门编程语言C&#xff0c;随着也学到了取余(%)和三目运算符(? :)&#xff0c;当时就觉得(? :)真的牛逼&#xff0c;但在编程时却很少…

传统编译器和DL编译器的调研和理解

文章目录Part One : 传统编译器1.1 前端1.2 中端常见的优化1.3 后端指令的选择寄存器分配指令重排1.4 总结Part Two&#xff1a;深度学习编译器2.1 为什么需要 DL Compiler2.2 DL Compiler 的通用架构设计前端后端2.3 主流深度学习编译框架对比2.4 传统编译器 vs DL 编译器2.5 …