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


  • 相关阅读:
    Spring学习(一)初识Spring
    搜索引擎学习(七)解析查询
    搜索引擎学习(六)Query的子类查询
    Oracle学习(十四)分表分区
    Oracle学习(十三)优化专题
    Python学习————流程控制之while循环
    Python学习————深浅copy
    Python学习————while循环作业
    Python学习————运算符
    Python学习————与用户交互
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6734598.html
Copyright © 2011-2022 走看看