程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP5.5三種序列化性能對比

PHP5.5三種序列化性能對比

編輯:關於PHP編程

PHP5.5三種序列化性能對比


json_encode,serialize,igbinary三種序列化方式,在之前已經有過相關的測試,PHP5.5這方面的測試暫時沒有,這次測試基於PHP5.5,並且測試用例,
http://blog.csdn.net/hguisu/article/details/7651730
的測試用例是一樣的,只是從這個測試上家裡igbinary serialize的測試,作為對比,可以參考
http://www.ooso.net/archives/538

運行環境
PHP5.5 內存 16G 8核 2.0GMHz

性能&空間大小列表
\

采用小數組測試結果

json :156
serialize :222
igbinary_serialize :123
json_encode :0.02264404296875
json_decode :0.052916049957275
serialize :0.031183004379272
unserialize :0.029985904693604
Igbinary Serialize: 0.024919986724854
Igbinary unSerialize: 0.019716024398804

方便對比把之前PHP5.3的測試結果放到下面(之前並未測試igbinary)

json :156
serialize :222
json_encode :0.1087498664856
json_decode :0.12652111053467
serialize :0.041656017303467
unserialize :0.040987968444824

采用大數組測試結果

json :5350
serialize :8590
igbinary_serialize :2432
json_encode :0.92639899253845
json_decode :1.8222811222076
serialize :1.3030271530151
unserialize :1.1492691040039
Igbinary Serialize: 0.95630598068237
Igbinary unSerialize: 0.82603001594543

下面是之前的結果(之前並未測試igbinary)

json :5350
serialize :8590
json_encode :0.90479207038879
json_decode :1.753741979599
serialize :1.3566699028015
unserialize :1.3003630638123

小結:
數據方面:
1:升級到PHP5.5後,json,serialize,igbinary三種方式序列化後,大小沒有變化,說明這三種格式的對象結構沒有沒有變化,所以可以無縫升級。
2:占用空間方面,igbinary節省空間明顯優勢,比如在json一個數組5.4k大小的數據,serialize方式要8.6k,而使用igbinary方式,僅需2.4k,近乎為serialize方式的1/4。
性能方面
1:在小數據時,json和原生serialize的性能都比PHP5.3版本有所提升,而在處理大數據量時,性能又有所下降。
2:在序列化方面,json_encode的性能是最好的,其次是igbinary,兩者相差無幾,最差的為原生serialize,原生serialize性能消耗大概為json和igbinary方式的的1.4倍左右
3:在反序列方面igbinary的比序列化過程更快,當然也是最快的,但是這種快也是有成本代價的,參見最後的注意事項。
4:整體性能對比,整體性能是序列化和反序列化之和,簡單對比會發現,json是最差的,次之是原生serialize,再好的為ibinary的方式。

綜合來說無論從序列化性能還是從占用空間上來說,都是igbinary都是最優選擇。但是使用igbinary並非沒有代價,在測試中我們發現,調用igbinary_unserialize時,傳遞非法數據,會導致整個php進程死掉,日志

child 19131 exited on signal 11 (SIGSEGV) after  1.844938 seconds from start 1.844938 seconds from start
估計是因為igbinary為了提升性能,在unserialize時,沒有做相關格式驗證,導致整個進程異常退出。在使用Redis時,我們先期使用SERIALIZE_PHP方式序列化,為了提升性能,減少對Redis空間的浪費采用igbinary_serialize方式,再切換的時候不小心踩到這個坑,導致服務器響應出錯,直接502,幸虧在daily環境上。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved