PHP5.5四种序列化性能对比
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
結(jié)論:
1、小數(shù)組用msgpack,無論空間和性能都最好
2、大數(shù)組,考慮空間用igbinary,考慮性能用msgpack
json_encode,serialize,igbinary,msgpack四種序列化方式,在之前已經(jīng)有過相關(guān)的測試,PHP5.5這方面的測試暫時沒有,這次測試基于PHP5.5,并且測試用例,
http://blog.csdn.net/hguisu/article/details/7651730
的測試用例是一樣的,只是從這個測試上家里igbinary serialize的測試,作為對比,可以參考
http://www.ooso.net/archives/538
運行環(huán)境
? ? ? ? PHP5.5 內(nèi)存 16G 8核 2.0GMHz
性能&空間大小列表
采用小數(shù)組測試結(jié)果(注意為了數(shù)據(jù)好看,小數(shù)組測試時,循環(huán)次數(shù)為10000次,大數(shù)組為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的測試結(jié)果放到下面(之前并未測試igbinary)
[html] view plaincopy
json?:156??
serialize?:222??
json_encode?:0.1087498664856??
json_decode?:0.12652111053467??
serialize?:0.041656017303467??
unserialize?:0.040987968444824??
采用大數(shù)組測試結(jié)果
[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??
下面是之前的結(jié)果(之前并未測試igbinary)
[html] view plaincopy
json?:5350??
serialize?:8590??
json_encode?:0.90479207038879??
json_decode?:1.753741979599??
serialize?:1.3566699028015??
unserialize?:1.3003630638123??
小結(jié):
數(shù)據(jù)方面:
? ? ? 1:升級到PHP5.5后,json,serialize,igbinary三種方式序列化后,大小沒有變化,說明這三種格式的對象結(jié)構(gòu)沒有沒有變化,所以可以無縫升級,msgpack由于沒有之前的數(shù)據(jù)做對比,暫時未知。
? ? ? 2:占用空間方面,igbinary節(jié)省空間明顯優(yōu)勢,比如在json一個數(shù)組5.4k大小的數(shù)據(jù),serialize方式要8.6k,而使用 igbinary方式,僅需2.4k,近乎為serialize方式的1/4,但在小數(shù)組方面msgpack方式更具優(yōu)勢,igbinary占用空間 123,而msgpack方式僅為102。但是在大數(shù)組情況下,明顯igbinary方式優(yōu)勢更明顯。大數(shù)組igbinary勝出,小數(shù)組msgpack 勝出。
性能方面:
? ? ? 1:在小數(shù)據(jù)時,json和原生serialize的性能都比PHP5.3版本有所提升,而在處理大數(shù)據(jù)量時,性能又有所下降。
? ? ? 2:在序列化方面,msgpack方式性能最好,其次是json_encode的,再次是igbinary,這兩者相差無幾,最差的為原生 serialize,原生serialize性能消耗大概為json和igbinary方式的的1.4倍左右,而是msgpack方式的2倍。在大數(shù)組方 面,序列化方便,基本上和小數(shù)組一致,只是igbinary性能教較json_encode方式有所提升。本輪msgpack勝出。
? ? ? 3:在反序列方面igbinary的比序列化過程更快,當(dāng)然也是最快的,但是這種快也是有成本代價的,參見最后的注意事項,最慢的為 json_decode方式,猜測原因可能在于PHP作為服務(wù)器端應(yīng)用,最多的場景是encode,而decode的最常見的為js處理方式,性能不是很 理想。而msgpack反序列化性能基本上是它序列化的2倍。本輪igbinary勝出。
? ? ? 4:整體性能對比,整體性能是序列化和反序列化之和,簡單對比會發(fā)現(xiàn),json是最差的,次之是原生serialize,再次為igbinary的方式, 最優(yōu)的為msgpack,不過igbinary和msgpack相差真的非常小,而在占用空間方面,小數(shù)據(jù)時msgpack勝出,大數(shù)據(jù)時 igbinary勝出,算是各有千秋。所以,如果追求極致的性能,可以考慮使用msgpack,如果對是使用空間要求苛刻,那就選擇igbinary方 式,估計這也是PHPRedis選擇igbinary作為內(nèi)置序列化方式的原因之一,另外還有一個原因,考慮到Redis應(yīng)用場景多是一寫多讀,要保證反 序列化性能足夠高,非igbinary莫屬。
使用igbinary并非沒有代價,在測試中我們發(fā)現(xiàn),調(diào)用igbinary_unserialize時,傳遞非法數(shù)據(jù),會導(dǎo)致整個php進程死掉,日志
[html] view plaincopy
child?19131?exited?on?signal?11?(SIGSEGV)?after??1.844938?seconds?from?start?1.844938?seconds?from?start??
估 計是因為igbinary為了提升性能,在unserialize時,沒有做相關(guān)格式驗證,導(dǎo)致整個進程異常退出。在使用Redis時,我們先期使用 SERIALIZE_PHP方式序列化,為了提升性能,減少對Redis空間的浪費采用igbinary_serialize方式,再切換的時候不小心踩 到這個坑,導(dǎo)致服務(wù)器響應(yīng)出錯,直接502,幸虧在daily環(huán)境上。
轉(zhuǎn)載于:https://my.oschina.net/jiangchike/blog/475086
總結(jié)
以上是生活随笔為你收集整理的PHP5.5四种序列化性能对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 固有属性与自定义属性
- 下一篇: uniq用法详解