avro和java原生序列化的区别,java原生序列化和Kryo序列化性能比较
簡(jiǎn)介
最近幾年,各種新的高效序列化方式層出不窮,不斷刷新序列化性能的上限,最典型的包括:
專門針對(duì)Java語(yǔ)言的:Kryo,FST等等
跨語(yǔ)言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等
這些序列化方式的性能多數(shù)都顯著優(yōu)于hessian2(甚至包括尚未成熟的dubbo序列化)。有鑒于此,我們?yōu)閐ubbo引入Kryo和FST這 兩種高效Java序列化實(shí)現(xiàn),來(lái)逐步取代hessian2。其中,Kryo是一種非常成熟的序列化實(shí)現(xiàn),已經(jīng)在Twitter、Groupon、 Yahoo以及多個(gè)著名開源項(xiàng)目(如Hive、Storm)中廣泛的使用。而FST是一種較新的序列化實(shí)現(xiàn),目前還缺乏足夠多的成熟使用案例,但它還是非 常有前途的,下面我們比較下,java原生序列化Kryo序列化性能比較
1、實(shí)體類 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原生序列化時(shí)間:" + (System.currentTimeMillis() - start) + " ms" );start=System.currentTimeMillis();
getSerializableObject();
System.out.println("java原生反序列化時(shí)間:" + (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 序列化時(shí)間:" + (System.currentTimeMillis() - start) + " ms");
start=System.currentTimeMillis();
getSerializableObject();
System.out.println("Kryo 反序列化時(shí)間:" + (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、測(cè)試結(jié)果對(duì)比
java原生序列化時(shí)間:8281 ms java原生反序列化時(shí)間:5899 ms
和
Kryo 序列化時(shí)間:630 ms Kryo 反序列化時(shí)間:15 ms
經(jīng)過(guò)對(duì)比,可以發(fā)現(xiàn)kryo是java原生序列化性能十幾倍
總結(jié)
以上是生活随笔為你收集整理的avro和java原生序列化的区别,java原生序列化和Kryo序列化性能比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux自动重新启动,linux 系统
- 下一篇: java servlet是单例吗_关于j