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,Map map){ this.name=name; this.age=age; this.map=map; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicMap getMap(){ returnmap; } publicvoidsetMap(Map map){ 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序列化的差异等,有什么问题可以随时留言,小编必定及时回复大家,感谢朋友们对本站的支持。