zoukankan      html  css  js  c++  java
  • PHP5.5四种序列化性能对照

    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次)

    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)

    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
    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)

    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作为server端应用,最多的场景是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进程死掉,日志

    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方式,再切换的时候不小心踩到这个坑,导致server响应出错。直接502。幸亏在daily环境上。


  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6734598.html
Copyright © 2011-2022 走看看