PHP里面,有时候出于实际需求考虑,需要将某些信息以数组的方式进行存储,甚至有时候介于数组、字符串两者之间,很难确定是数组还是字符串,如果最终还需要将这些信息存储到文件系统中,而且要保证正确无误的存储、读取。能达到这种效果的有两组函数,分别是serialize/unserialize和json_encode/json_decode,其中,serialize是将数组序列化,变成字符串格式,而unserialize正好相反,是将序列化的字符串进行反序列化,变成数组;而json_encode是将变量转换成JSON格式的数据,而json_decode则是将JSON格式的数据转换为对象(数组、JSON等)。 以下就以上两组函数的优缺点简单作个对比。

前面已经说明了情况,不仅要对变量进行转义,还要将转义后的内容进行存储、读取,经过本人测试发现,在对变量进行转义方面serialize/unserialize相比之下要比json_encode/json_decode高效一些,不过,也没有高得离谱,那么,对于大数据方面,二者就有比较大的区别了。

举个例子,通过下面这段代码,产生一个包含20万个(数组)元素的数组,
$module = [];
for($i=0;$i<200000;$i++){
 $module[$i] = ['SN'=>$S->doSN(),'str'=>$S->randChar(30)];
}
注:doSN()的作用是产生一个10位的订单序列号,randChar(30)是产生一个30位的随机字符串,这两个函数不是本次的重点,不作详解。

通过前面的代码对$module数组进行赋值,接下来就是对数组进行转义了,实际操作发现,serialize($module)时会报错,“Fatal
error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 14684160 bytes) in ”,如下图:

大概的意思是内存超过了系统允许的14684160B,当然也可以修改PHP.INI来加大。而json_encode($module)就不存在这个问题,虽然说笔者没有继续测试下去看看json_encode会不会也出现内存溢出的情况,但是,就目前的情况来说,json_encode似乎要更强大一点。

好了,接着测试另一种情况,“容错”,这里的容错指的是当无法判断需要转义/反转义的变量是数组还是字符串的情况,如下:

$str = 'PHP'; //简单的定义一个字符串变量,
serialize($str)得到的结果是s:3:"PHP";
json_encode($str)得到的结果是"PHP";
都没有报错,同样的,我们看下反转义的。
unserialize($str)出错了,Notice: unserialize(): Error at offset 0 of 3 bytes in

json_decode($str)没有报错,返回值是NULL,这个好理解,毕竟前面的$str中的内容不是一个有效的JSON格式数据。

到这里,大概的总结以下几点:
1、大数组情况下,JSON组函数要更耐用;
2、对未知类型的变量进行反转义时,JSON组函数容错性要更理想;
3、相比而言,JSON组函数转义后的字符串要更短一些,作为文件存储,可以节约一定的存储空间。

顺便,对serialize和json_encode的效率进行一个简单的对比,

$stime = time();
 for($i=0;$i<200000;$i++){
  serialize(['SN'=>$S->doSN(),'str'=>$S->randChar(30)]);
 }
 echo '<br><br>进行20万次serialize运算花费' . (time()-$stime) . '秒';

$stime = time();
 for($i=0;$i<200000;$i++){
  json_encode(['SN'=>$S->doSN(),'str'=>$S->randChar(30)]);
 }
 echo '<br><br>进行20万次json_encode运算花费' . (time()-$stime) . '秒';

通过上面的对比发现,20万次同样的操作,serialize比json_encode快1秒,这样算下来,单次执行而言二者基本上是不相上下了。

PHP json_encode/json_decode与serialize/unserializ性能测的更多相关文章

  1. php 序列化储存和转化 json_encode() json_decode($q,true)

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 例如:当需要数据库只有一个 ...

  2. PHP多种序列化/反序列化的方法 json_encode json_decode

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize和 ...

  3. PHP json_encode / json_decode

    2015年3月26日 14:14:16 PHP的json函数对几个特殊值的处理笔记 <?php //----------编码 $a = array(); $b = json_encode($a) ...

  4. php model与json_encode/json_decode

    常用于model的操作,看看就知道了 <?php class UserModel { var $user_id = 0; var $user_name = ''; var $user_email ...

  5. Json处理函数json_encode json_decode

    json_decode — 对 JSON 格式的字符串进行编码 mixed json_decode ( string $json [, bool $assoc = false [, int $dept ...

  6. Jmeter作为工具的性能测

    [原创]相对完整的一套以Jmeter作为工具的性能测试教程(接口性能测试,数据库性能测试以及服务器端性能监测) 准备工作 jmeter3.1,为什么是3.1,因为它是要配合使用的serveragent ...

  7. jmeter对需要登录的接口进行性能测测试

    只需要一步: https://www.testwo.com/blog/7253

  8. php中serialize、unserialize与json_encode、json_decode比较

    性能比较 同一个变量编码或解码10000次,每个函数执行10000次所需时间 php5.2.13 json : 190 serialize : 257 json_encode : 0.08364200 ...

  9. igbinary vs serialize vs json_encode

    igbinary vs serialize vs json_encode 2010-04-18 @ 23:01:58 · 作者 Volcano · 归类于 php 你可能会感兴趣的内容 关于" ...

随机推荐

  1. [No0000147]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈4/4

    前言   虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...

  2. 用CountDownLatch提升请求处理速度

    countdownlatch是java多线程包concurrent里的一个常见工具类,通过使用它可以借助线程能力极大提升处理响应速度,且实现方式非常优雅.今天我们用一个实际案例和大家来讲解一下如何使用 ...

  3. PHP之流程控制

    nest 嵌套 the curly braces 花括号 colon syntax 冒号语法 PHP三种if判断的写法 写法一: if(true){ }else if(){ }else if(){ } ...

  4. Hash算法解决冲突的方法

    https://blog.csdn.net/feinik/article/details/54974293 Hash算法解决冲突的方法一般有以下几种常用的解决方法1, 开放定址法:所谓的开放定址法就是 ...

  5. Numpy 机器学习三剑客之Numpy

    NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机 ...

  6. mysql之索引简介

    索引分类 mysql在存储数据时,是按着主键的顺序存储的.主键索引是物理索引,其他索引都是逻辑索引. 普通索引 普通索引是最基本的索引,没有任何限制的索引,普通索引列的数据可以重复.其唯一的任务就是加 ...

  7. numpy——.npy和.npz文件

    npy文件--Numpy专用的二进制格式np.load()和np.save()是读写磁盘数组数据的两个重要函数.使用时,数组会以未压缩的原始二进制格式保存在扩展名为.npy的文件中. import n ...

  8. C# Asp.net 修改Ueditor编辑器上传图片保存路径

    默认情况下Ueditor图片上传的保存路径是在/ueditor/net/upload/目录下,(如:http://localhost/ueditor/net/upload/123.png), 但是有时 ...

  9. 转载:caffe中的Reshape层

    http://blog.csdn.net/terrenceyuu/article/details/76228317 #作用:在不改变数据的情况下,改变输入的维度 layer { name: " ...

  10. InnoDB体系架构

    MySQL支持插件式存储引擎,常用的存储引擎则是MyISAM和InnoDB,通常在OLTP(Online Transaction Processing 在线事务处理)中,我们选择使用InnoDB,所以 ...