java原生序列化和Kryo序列化性能实例对比分析
简介
最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:
专门针对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;
publicclassSimpleimplementsSerializable
{
privatestaticfinallongserialVersionUID=-4914434736682797743L;
privateStringname;
privateintage;
privateMapmap;
publicSimple(){
}
publicSimple(Stringname,intage,Mapmap){
this.name=name;
this.age=age;
this.map=map;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicMapgetMap(){
returnmap;
}
publicvoidsetMap(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;
publicclassOriginalSerializable{
publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{
longstart=System.currentTimeMillis();
setSerializableObject();
System.out.println("java原生序列化时间:"+(System.currentTimeMillis()-start)+"ms");
start=System.currentTimeMillis();
getSerializableObject();
System.out.println("java原生反序列化时间:"+(System.currentTimeMillis()-start)+"ms");
}
publicstaticvoidsetSerializableObject()throwsIOException{
FileOutputStreamfo=newFileOutputStream("D:/file2.bin");
ObjectOutputStreamso=newObjectOutputStream(fo);
for(inti=0;i<100000;i++){
Mapmap=newHashMap(2);
map.put("zhang0",i);
map.put("zhang1",i);
so.writeObject(newSimple("zhang"+i,(i+1),map));
}
so.flush();
so.close();
}
publicstaticvoidgetSerializableObject(){
FileInputStreamfi;
try{
fi=newFileInputStream("D:/file2.bin");
ObjectInputStreamsi=newObjectInputStream(fi);
Simplesimple=null;
while((simple=(Simple)si.readObject())!=null){
//System.out.println(simple.getAge()+""+simple.getName());
}
fi.close();
si.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(IOExceptione){
//e.printStackTrace();
}catch(ClassNotFoundExceptione){
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;
publicclassKyroSerializable{
publicstaticvoidmain(String[]args)throwsIOException{
longstart=System.currentTimeMillis();
setSerializableObject();
System.out.println("Kryo序列化时间:"+(System.currentTimeMillis()-start)+"ms");
start=System.currentTimeMillis();
getSerializableObject();
System.out.println("Kryo反序列化时间:"+(System.currentTimeMillis()-start)+"ms");
}
publicstaticvoidsetSerializableObject()throwsFileNotFoundException{
Kryokryo=newKryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(false);
kryo.setInstantiatorStrategy(newStdInstantiatorStrategy());
kryo.register(Simple.class);
Outputoutput=newOutput(newFileOutputStream("D:/file1.bin"));
for(inti=0;i<100000;i++){
Mapmap=newHashMap(2);
map.put("zhang0",i);
map.put("zhang1",i);
kryo.writeObject(output,newSimple("zhang"+i,(i+1),map));
}
output.flush();
output.close();
}
publicstaticvoidgetSerializableObject(){
Kryokryo=newKryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(false);
kryo.setInstantiatorStrategy(newStdInstantiatorStrategy());
Inputinput;
try{
input=newInput(newFileInputStream("D:/file1.bin"));
Simplesimple=null;
while((simple=kryo.readObject(input,Simple.class))!=null){
//System.out.println(simple.getAge()+""+simple.getName()+""+simple.getMap().toString());
}
input.close();
}catch(FileNotFoundExceptione){
e.printStackTrace();
}catch(KryoExceptione){
}
}
}
4、测试结果对比
java原生序列化时间:8281ms
java原生反序列化时间:5899ms
和
Kryo序列化时间:630ms
Kryo反序列化时间:15ms
经过对比,可以发现kryo是java原生序列化性能十几倍
总结
以上就是本文关于java原生序列化和Kryo序列化性能实例对比分析的全部内容,希望对大家有所帮助,感兴趣的朋友可以参考:Kryo框架使用方法代码示例 实例解析Json反序列化之ObjectMapper(自定义实现反序列化方法) 浅谈Java序列化和hessian序列化的差异等,有什么问题可以随时留言,小编必定及时回复大家,感谢朋友们对本站的支持。