序列化框架效能對比(kryo、hessian、java、protostuff)
序列化框架效能對比(kryo、hessian、java、protostuff)
簡介:
優點 |
缺點 |
|
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:
deser: 將byte陣列反序列化成物件的時間
total: 建立一個物件,將其序列化成byte陣列再反序列化為物件的總時間
size: 序列化後的陣列大小
size+dfl: 序列化後用level6級別的zlib進行壓縮後的大小
測試工具:
序列化工具 |
序列化方式 |
kryo |
使用kryo預設的序列化方式fieldSerializer, 對需要序列化的物件採取預設的操作。開啟reference,關閉register |
protostuff |
使用靜態編譯生成的Schema進行序列化 |
protostuff-runtime |
使用protostuff-runtime框架生成Schema進行序列化 |
測試結果:
時間:
大小:
總結:
Kryo在類註冊且reference關閉的情況下,序列化速度和大小明顯優於hessian和java,接近於protostuff。開啟reference後將序列化速度將明顯變慢,但仍舊優於hessian。
相關知識:
類註冊:將需要序列化的類註冊到kryo中,可以提高序列化與反序列化的速度。
Reference:開啟這個選項後,相同的物件將被序列化為同一個byte[],預設關閉,如果要支援迴圈引用,則必須開啟
穩定性測試:
測試用例(見附件)
迴圈引用:Cyclic.java
序列化方式 |
無預設建構函式 |
迴圈引用 |
物件為null |
是否需要預先知道物件所屬的類 |
大物件(4M) |
Kryo |
支援 |
需將reference選項開啟 |
支援 |
不需要,關閉register |
支援 |
Java |
支援 |
支援 |
支援 |
不需要 |
支援 |
Protostuff |
支援 |
支援 |
支援 |
不需要 |
支援 |
Protostuff -runtime |
不支援 |
支援 |
支援 |
需要 |
支援 |
Hessian |
支援 |
支援 |
支援 |
不需要 |
支援 |