PHP5.5四种序列化性能对比
2019獨角獸企業重金招聘Python工程師標準>>>
結論:
1、小數組用msgpack,無論空間和性能都最好
2、大數組,考慮空間用igbinary,考慮性能用msgpack
json_encode,serialize,igbinary,msgpack四種序列化方式,在之前已經有過相關的測試,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
性能&空間大小列表
采用小數組測試結果(注意為了數據好看,小數組測試時,循環次數為10000次,大數組為1000次)
[html] view plaincopy
json?:156??
serialize?:222??
igbinary_serialize?:123??
msgpack?:102??
json_encode?:0.22339701652527??
json_decode?:0.53043985366821??
serialize?:0.31040406227112??
unserialize?:0.30859398841858??
Igbinary?Serialize:?0.25647687911987??
Igbinary?unSerialize:?0.19416117668152??
msgpack_pack:?0.14058780670166??
msgpack_unpack:?0.29048585891724??
方便對比把之前PHP5.3的測試結果放到下面(之前并未測試igbinary)
[html] view plaincopy
json?:156??
serialize?:222??
json_encode?:0.1087498664856??
json_decode?:0.12652111053467??
serialize?:0.041656017303467??
unserialize?:0.040987968444824??
采用大數組測試結果
[html] view plaincopy
json?:5350??
serialize?:8590??
igbinary_serialize?:2432??
msgpack?:3929??
json_encode?:0.92437314987183??
json_decode?:1.791629076004??
serialize?:1.3011419773102??
unserialize?:1.1485421657562??
Igbinary?Serialize:?0.90479803085327??
Igbinary?unSerialize:?0.69125699996948??
msgpack_pack:?0.52022004127502??
msgpack_unpack:?1.0104610919952??
下面是之前的結果(之前并未測試igbinary)
[html] view plaincopy
json?:5350??
serialize?:8590??
json_encode?:0.90479207038879??
json_decode?:1.753741979599??
serialize?:1.3566699028015??
unserialize?:1.3003630638123??
小結:
數據方面:
? ? ? 1:升級到PHP5.5后,json,serialize,igbinary三種方式序列化后,大小沒有變化,說明這三種格式的對象結構沒有沒有變化,所以可以無縫升級,msgpack由于沒有之前的數據做對比,暫時未知。
? ? ? 2:占用空間方面,igbinary節省空間明顯優勢,比如在json一個數組5.4k大小的數據,serialize方式要8.6k,而使用 igbinary方式,僅需2.4k,近乎為serialize方式的1/4,但在小數組方面msgpack方式更具優勢,igbinary占用空間 123,而msgpack方式僅為102。但是在大數組情況下,明顯igbinary方式優勢更明顯。大數組igbinary勝出,小數組msgpack 勝出。
性能方面:
? ? ? 1:在小數據時,json和原生serialize的性能都比PHP5.3版本有所提升,而在處理大數據量時,性能又有所下降。
? ? ? 2:在序列化方面,msgpack方式性能最好,其次是json_encode的,再次是igbinary,這兩者相差無幾,最差的為原生 serialize,原生serialize性能消耗大概為json和igbinary方式的的1.4倍左右,而是msgpack方式的2倍。在大數組方 面,序列化方便,基本上和小數組一致,只是igbinary性能教較json_encode方式有所提升。本輪msgpack勝出。
? ? ? 3:在反序列方面igbinary的比序列化過程更快,當然也是最快的,但是這種快也是有成本代價的,參見最后的注意事項,最慢的為 json_decode方式,猜測原因可能在于PHP作為服務器端應用,最多的場景是encode,而decode的最常見的為js處理方式,性能不是很 理想。而msgpack反序列化性能基本上是它序列化的2倍。本輪igbinary勝出。
? ? ? 4:整體性能對比,整體性能是序列化和反序列化之和,簡單對比會發現,json是最差的,次之是原生serialize,再次為igbinary的方式, 最優的為msgpack,不過igbinary和msgpack相差真的非常小,而在占用空間方面,小數據時msgpack勝出,大數據時 igbinary勝出,算是各有千秋。所以,如果追求極致的性能,可以考慮使用msgpack,如果對是使用空間要求苛刻,那就選擇igbinary方 式,估計這也是PHPRedis選擇igbinary作為內置序列化方式的原因之一,另外還有一個原因,考慮到Redis應用場景多是一寫多讀,要保證反 序列化性能足夠高,非igbinary莫屬。
使用igbinary并非沒有代價,在測試中我們發現,調用igbinary_unserialize時,傳遞非法數據,會導致整個php進程死掉,日志
[html] view plaincopy
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環境上。
轉載于:https://my.oschina.net/jiangchike/blog/475086
總結
以上是生活随笔為你收集整理的PHP5.5四种序列化性能对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 固有属性与自定义属性
- 下一篇: 动态规划算法php,php算法学习之动态