java原生序列化和Kryo序列化性能實(shí)例對(duì)比分析
簡(jiǎn)介
最近幾年,各種新的高效序列化方式層出不窮,不斷刷新序列化性能的上限,最典型的包括:
專門(mén)針對(duì)Java語(yǔ)言的:Kryo,F(xiàn)ST等等
跨語(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è)著名開(kāi)源項(xiàng)目(如Hive、Storm)中廣泛的使用。而FST是一種較新的序列化實(shí)現(xiàn),目前還缺乏足夠多的成熟使用案例,但它還是非 常有前途的,下面我們比較下,java原生序列化Kryo序列化性能比較
1、實(shí)體類(lèi) Simple.java
package bhz.entity; import java.io.Serializable; import java.util.Map; public class Simple implements Serializable { private static final long serialVersionUID = -4914434736682797743L; private String name; private int age; private Map<String,Integer> map; public Simple(){ } public Simple(String name,int age,Map<String,Integer> map){ this.name = name; this.age = age; this.map = map; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Map<String, Integer> getMap() { return map; } public void setMap(Map<String, Integer> map) { this.map = map; } }
2、java原生序列化 OriginalSerializable.java
package bhz.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.HashMap; import java.util.Map; import bhz.entity.Simple; public class OriginalSerializable { public static void main(String[] args) throws IOException, 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() throws IOException{ FileOutputStream fo = new FileOutputStream("D:/file2.bin"); ObjectOutputStream so = new ObjectOutputStream(fo); for (int i = 0; i < 100000; i++) { Map<String,Integer> map = new HashMap<String, Integer>(2); map.put("zhang0", i); map.put("zhang1", i); so.writeObject(new Simple("zhang"+i,(i+1),map)); } so.flush(); so.close(); } public static void getSerializableObject(){ FileInputStream fi; try { fi = new FileInputStream("D:/file2.bin"); ObjectInputStream si = new ObjectInputStream(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
package bhz.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.objenesis.strategy.StdInstantiatorStrategy; import bhz.entity.Simple; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.KryoException; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; public class KyroSerializable { public static void main(String[] args) throws IOException { 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() throws FileNotFoundException{ Kryo kryo = new Kryo(); kryo.setReferences(false); kryo.setRegistrationRequired(false); kryo.setInstantiatorStrategy(new StdInstantiatorStrategy()); kryo.register(Simple.class); Output output = new Output(new FileOutputStream("D:/file1.bin")); for (int i = 0; i < 100000; i++) { Map<String,Integer> map = new HashMap<String, Integer>(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 void getSerializableObject(){ Kryo kryo = new Kryo(); kryo.setReferences(false); kryo.setRegistrationRequired(false); kryo.setInstantiatorStrategy(new StdInstantiatorStrategy()); 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é)
以上就是本文關(guān)于java原生序列化和Kryo序列化性能實(shí)例對(duì)比分析的全部?jī)?nèi)容,希望對(duì)大家有所幫助,感興趣的朋友可以參考:Kryo框架使用方法代碼示例 實(shí)例解析Json反序列化之ObjectMapper(自定義實(shí)現(xiàn)反序列化方法) 淺談Java序列化和hessian序列化的差異等,有什么問(wèn)題可以隨時(shí)留言,小編必定及時(shí)回復(fù)大家,感謝朋友們對(duì)本站的支持。
相關(guān)文章
SpringBoot項(xiàng)目中連接SQL Server的三種方式
連接SQL Server是許多Spring Boot項(xiàng)目中常見(jiàn)的需求之一,本文主要介紹了SpringBoot項(xiàng)目中連接SQL Server的三種方式,具有一定的參考價(jià)值 ,感興趣的可以了解一下2023-09-09解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過(guò)代理類(lèi)的問(wèn)題
這篇文章主要介紹了解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過(guò)代理類(lèi)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01SpringBoot過(guò)濾敏感詞的兩種實(shí)現(xiàn)方式
Spring Boot本身并不直接提供過(guò)濾敏感詞的功能,但你可以使用第三方庫(kù)或者自定義過(guò)濾器來(lái)實(shí)現(xiàn)這個(gè)需求,所以本文給大家介紹了SpringBoot過(guò)濾敏感詞的兩種實(shí)現(xiàn)方式,感興趣的朋友可以參考下2024-06-06Java中的復(fù)合數(shù)據(jù)類(lèi)型
這篇文章主要介紹了Java中的復(fù)合數(shù)據(jù)類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Okhttp在SpringBoot中的應(yīng)用實(shí)戰(zhàn)記錄(太強(qiáng)了)
這篇文章主要給大家介紹了關(guān)于Okhttp在SpringBoot中應(yīng)用實(shí)戰(zhàn)的相關(guān)資料,在Spring Boot中使用OkHttp主要是為了發(fā)送HTTP請(qǐng)求和處理響應(yīng),OkHttp是一個(gè)高效、易用的HTTP客戶端庫(kù),它具有簡(jiǎn)潔的API和強(qiáng)大的功能,需要的朋友可以參考下2023-12-12關(guān)于Spring統(tǒng)一異常處理及說(shuō)明
這篇文章主要介紹了關(guān)于Spring統(tǒng)一異常處理及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09java布局管理之CardLayout簡(jiǎn)單實(shí)例
這篇文章主要為大家詳細(xì)介紹了java布局管理之CardLayout的簡(jiǎn)單實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03