1. 程式人生 > >序列化框架效能對比(kryo、hessian、java、protostuff)

序列化框架效能對比(kryo、hessian、java、protostuff)

序列化框架效能對比(kryohessianjavaprotostuff

簡介:

優點

缺點

Kryo

速度快,序列化後體積小

跨語言支援較複雜

Hessian

預設支援跨語言

較慢

Protostuff

速度快,基於protobuf

需靜態編譯

Protostuff-Runtime

無需靜態編譯,但序列化前需預先傳入schema

不支援無預設建構函式的類,反序列化時需使用者自己初始化序列化後的物件,其只負責將該物件進行賦值

Java

使用方便,可序列化所有類

速度慢,佔空間

測試環境:

硬體資訊:

         16 Intel(R) Xeon(R) CPU E5620 @2.40GHz

         Red Hat Enterprise Linux Server release 5.4 (Tikanga)

         java:  "1.6.0_27" Java HotSpot(TM) 64-Bit Server VM (build 20.2-b06, mixed mode)

         JVM options: java -Xmx256m –server

測試資料:(見附件)

         ArrayList.class

         MediaContent.class

         Media.class

         Image.class

<!--[if !supportLists]-->1、<!--[endif]-->在正式測試之前,將測試用例執行10次對JVM進行預熱。

<!--[if !supportLists]-->2、<!--[endif]-->對測試用例的每個方法,執行2000次,取平均值。

<!--[if !supportLists]-->3、<!--[endif]-->每次測試用例執行500次,取最優結果

測試基準:

         ser:          

建立一個物件,並將其序列化成byte陣列的時間

         deser:       byte陣列反序列化成物件的時間

         total:        建立一個物件,將其序列化成byte陣列再反序列化為物件的總時間

         size:          序列化後的陣列大小

         size+dfl:   序列化後用level6級別的zlib進行壓縮後的大小

測試工具:

序列化工具

序列化方式

kryo

使用kryo預設的序列化方式fieldSerializer

對需要序列化的物件採取預設的操作。開啟reference,關閉register

protostuff

使用靜態編譯生成的Schema進行序列化

protostuff-runtime

使用protostuff-runtime框架生成Schema進行序列化

測試結果:

時間:


大小:


總結:

         Kryo在類註冊且reference關閉的情況下,序列化速度和大小明顯優於hessianjava,接近於protostuff。開啟reference後將序列化速度將明顯變慢,但仍舊優於hessian

相關知識:

類註冊:將需要序列化的類註冊到kryo中,可以提高序列化與反序列化的速度。

         Reference:開啟這個選項後,相同的物件將被序列化為同一個byte[],預設關閉,如果要支援迴圈引用,則必須開啟

穩定性測試:

測試用例(見附件)

迴圈引用:Cyclic.java

序列化方式

無預設建構函式

迴圈引用

物件為null

是否需要預先知道物件所屬的類

大物件(4M)

Kryo

支援

需將reference選項開啟

支援

不需要,關閉register

支援

Java

支援

支援

支援

不需要

支援

Protostuff

支援

支援

支援

不需要

支援

Protostuff

-runtime

不支援

支援

支援

需要

支援

Hessian

支援

支援

支援

不需要

支援