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

  1. json :156

  2. serialize :222

  3. igbinary_serialize :123

  4. msgpack :102

  5. json_encode :0.22339701652527

  6. json_decode :0.53043985366821

  7. serialize :0.31040406227112

  8. unserialize :0.30859398841858

  9. Igbinary Serialize: 0.25647687911987

  10. Igbinary unSerialize: 0.19416117668152

  11. msgpack_pack: 0.14058780670166

  12. msgpack_unpack: 0.29048585891724

方便对比把之前PHP5.3的测试结果放到下面(之前并未测试igbinary)

[html] view plaincopy

  1. json :156

  2. serialize :222

  3. json_encode :0.1087498664856

  4. json_decode :0.12652111053467

  5. serialize :0.041656017303467

  6. unserialize :0.040987968444824

采用大数组测试结果

[html] view plaincopy

  1. json :5350

  2. serialize :8590

  3. igbinary_serialize :2432

  4. msgpack :3929

  5. json_encode :0.92437314987183

  6. json_decode :1.791629076004

  7. serialize :1.3011419773102

  8. unserialize :1.1485421657562

  9. Igbinary Serialize: 0.90479803085327

  10. Igbinary unSerialize: 0.69125699996948

  11. msgpack_pack: 0.52022004127502

  12. msgpack_unpack: 1.0104610919952

下面是之前的结果(之前并未测试igbinary)

[html] view plaincopy

  1. json :5350

  2. serialize :8590

  3. json_encode :0.90479207038879

  4. json_decode :1.753741979599

  5. serialize :1.3566699028015

  6. 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

  1. 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四种序列化性能对比相关推荐

  1. JDK8-lambda表达式四种forEach性能对比

    jdk8新特性流Stream编程 看了网上一些性能的比较,这里自己写一个进行测试 对比以下四种 普通forEach.java8中新的forEach.stream+forEach.parallelStr ...

  2. 三星note5 android版本区别吗,三星Note5哪种颜色好看?三星Note5四种颜色区别对比图解...

    三星Note5有几种颜色?哪种颜色更好看呢?三星Note5是一款时下非常受欢迎的大屏旗舰手机,搭载Exynos 7422八核处理器,4GB超大内存,配备S Pen触控笔,支持指纹识别等特性,颇受消费者 ...

  3. linux数据同步技术比较,linux下实现web数据同步的四种方式(性能比较)教程.docx

    linux下实现web数据同步的四种方式(性能比较)教程 实现web数据同步的四种方式=======================================1.nfs实现web数据共享2.rs ...

  4. Siege压力测试工具的安装及使用+python flask的四种wsgi方式对比

    文章目录 一.前言: 如果要支持https 二.安装使用: 文件备份: 1.mac安装: 2.linux 安装:[centos 服务器] 通用Linux安装: 3.window安装: 4.测试百度: ...

  5. PHP四种序列化方案

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

  6. Kryo,Hessain,Protostuff三种序列化方式对比

    前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...

  7. python dict遍历文件_python 字典(dict)遍历的四种方法性能测试报告

    python中,遍历dict的方法有四种.但这四种遍历的性能如何呢?我做了如下的测试 l = [(x,x) for x in xrange(10000)]d = dict(l)from time im ...

  8. python dict遍历_python 字典(dict)遍历的四种方法性能测试报告

    python中,遍历dict的方法有四种.但这四种遍历的性能如何呢?我做了如下的测试 l = [(x,x) for x in xrange(10000)] d = dict(l) from time ...

  9. python dict遍历性能_python 字典(dict)遍历的四种方法性能测试报告

    python中,遍历dict的方法有四种.但这四种遍历的性能如何呢?我做了如下的测试 l = [(x,x) for x in xrange(10000)] d = dict(l) from time ...

最新文章

  1. 算术运算符、数学函数Math、数据类型转换、自增自减运算符、关系逻辑运算符、位运算符、括号及运算符级别
  2. 开源 物联网接入_我们刚刚推出了开源产品。 那么接下来会发生什么呢?
  3. chrome浏览器的跨域设置,前端修改跨域问题
  4. 机器学习算法中的准确率、精确率、召回率和F值
  5. drawer的用法_MMDrawerController抽屉侧边栏的简单使用
  6. Web API 设计摘要
  7. 002..NET MVC实现自己的TempBag
  8. oracle和db2之间的基本差别
  9. MAC 终端打开sublime3
  10. java并发编程实战读书笔记4--生产者消费者模式和队列
  11. Java 8 你需要掌握的新特性
  12. php存储富文本编辑器内容到数据库
  13. 深度学习----Tensorflow再命名实体上常用的函数
  14. android app unlock sim pin,android Sim卡锁定 pin解锁流程学习
  15. 6. 抹平差异,统一类型转换服务ConversionService
  16. Web服务器群集——编译安装Apache构建虚拟主机
  17. 表不存在,但是可以查询、删除(没有返回结果,一直hang住)
  18. 毫米波雷达的硬件架构与射频前端
  19. 论文阅读(边缘计算人工智能工业互联网)
  20. 软件开发,重点在设计

热门文章

  1. 方法 手写promise_JS探索-手写Promise
  2. python深度优先_python数据结构之图深度优先和广度优先实例详解
  3. mysql查询 百万_MySQL百万级数据分页查询优化
  4. c语言期末考试复习题
  5. linux cd -目录,linux cd
  6. html表格通过邮件发送,通过html表格发电子邮件
  7. cos大乱斗服务器维护,《COS大乱斗》服务器数据互通公告
  8. 什么叫大数据人物画像_大数据时代,如何构建精准用户画像,直击精细化运营...
  9. Eclipse 答疑:Eclipse 如何更换夜间及外部主题?如何修改代码样式、背景颜色、字体大小?为何注释文字大小不一?
  10. Ajax在IE浏览器会出现中文乱码解决办法