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

PHP5.5四种序列化性能对照的更多相关文章

  1. PHP四种序列化方案

    原文地址:https://t.ti-node.com/thread/... 数据的序列化是一个非常有用的功能,然而目测很多人跟我一样,在刚接触这玩意的时候压根就不理解这货色到底是干啥用的,反正老师说了 ...

  2. linux下实现web数据同步的四种方式(性能比较)

    实现web数据同步的四种方式 ======================================= 1.nfs实现web数据共享2.rsync +inotify实现web数据同步3.rsyn ...

  3. 文件拷贝, 使用 BIO,NIO的对比,四种写法性能分析。

    测试环境: jdk 1.7 +  2G内存 测试代码基本上复制了: http://blog.csdn.net/tabactivity/article/details/9317143 1 2 3 4 5 ...

  4. 并查集类的c++封装,比較union_find algorithm四种实现方法之间的性能区别

    问题描写叙述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm ...

  5. Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较(转载)

    Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...

  6. Tomcat的四种基于HTTP协议的Connector性能比较

    Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...

  7. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  8. 笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

    四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成 ...

  9. C# 字符串拼接性能探索 c#中+、string.Concat、string.Format、StringBuilder.Append四种方式进行字符串拼接时的性能

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

随机推荐

  1. Java开发中所遇问题积累

    1.判断两个字符串是否相等时,如下,使用" == "无效: String name = "Jack"; if(name.equals("Jack&qu ...

  2. HBase数据迁移至Hive

    背景:需要将HBase中表xyz(列簇cf1,列val)迁移至Hive 1. 建立Hive和HBase的映射关系     1.1 运行hive shell进入hive命令行模式,运行如下脚本 CREA ...

  3. PHP高级教程-包含

    PHP 包含文件 PHP include 和 require 语句 在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容. include 和 require 语句用于在执 ...

  4. php之快速入门学习-11(数组排序)

    PHP 数组排序 数组中的元素可以按字母或数字顺序进行降序或升序排列. PHP - 数组排序函数 在本章中,我们将一一介绍下列 PHP 数组排序函数: sort() - 对数组进行升序排列 rsort ...

  5. ADS ARM 汇编和GNU ARM汇编

    Linux/Unix内核源代码用的编译器是GCC,而GCC采用的是AT&T的汇编格式,这与ADS下使用的汇编格式是不同的. 两种汇编格式的部分对比如下: GNU ARM汇编 ADS ARM汇编 ...

  6. 【IPC进程间通讯之二】管道Pipe

    IPC进程间通信+管道Pipe                IPC(Inter-Process Communication.进程间通信).         管道用于进程间共享数据,事实上质是共享内存 ...

  7. JAVA 爬虫Gecco

    主要代码: Gecco(matchUrl="https://github.com/{user}/{project}", pipelines="consolePipelin ...

  8. 编译时:virtual memory exhausted: Cannot allocate memory(转)

    一.问题 当安装虚拟机时系统时没有设置swap大小或设置内存太小,编译程序会出现virtual memory exhausted: Cannot allocate memory的问题,可以用swap扩 ...

  9. eclipse properties文件插件

      eclipse properties插件 CreateTime--2018年4月22日22:51:34 Author:Marydon 下载地址:properties文件插件.rar 1.将plug ...

  10. 让 linux centos 文件夹地址栏 位置栏显示出来的方法

    今天又拿起心爱的 linux ,发现多日不用又忘记了不少知识了    , 发现忘记的速度真是惊人的! 设置方法: 编辑-> 首选项-> 勾选 总是在浏览器窗口中打开,  如图: