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環境上。