PHP serialize() VS unserialize()性能测试

最近遇到需要将一个复杂数组存储在MySQL的问题,找到两者方式:json_encode()和seriliaze().到底使用哪一个,于是想要测试一下两者的性能及使用时保持数据的结构完整性情况。
手册解释:

serialize — Generates a storable representation of a value

serialize — 产生一个可存储的值的表示

unserialize — Creates a PHP value from a stored representation

unserialize — 从已存储的表示中创建 PHP 的值

看这个解释还是有点陶醉,第一眼基本不是很明白,接下来在测试的过程中加深加理解。
测试使用环境:本机WAMP/PHP 5.5.12

一、初步测试json_encode/json_decode的效率与字符串长度,对一个简单的二位数组进行10000此循环测试。

1.测试代码如下:

[php collapse=”false”]
<?php

$array = array(
‘name’=>’luoning’,
‘sex’=>’man’,
‘age’=>21,
‘adress’=>’Lanzhou’,
‘phone’=>’110’,
‘other’=>array(
‘QQ’=>’947703573’,
‘Weibo’=>’Near_Je’,
‘blog’=>’http://www.luoning.me’
)
);

$json = json_encode($array);
$seri = serialize($array);

//输出json_encode/serialize之后的字符串长度
echo "json :" , strlen($json) ,'<br/>’;
echo "serialize :", strlen($seri) ,'<br/>’;

//—–测试json_encode/json_decode开始—
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
json_encode($array);
}

$etime = microtime(true);
echo "json_encode :", ($etime – $stime) ,'<br/>’;

//———————————
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
json_decode($json,true);
}

$etime = microtime(true);

echo "json_decode :", ($etime – $stime),'<br/>’;

//——测试serialize/unserialize开始—–
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
serialize($array);
}

$etime = microtime(true);

echo "serialize :", ($etime – $stime) ,'<br/>’;

//——————————-
$stime = microtime(true);

for ($i = 0; $i < 10000; $i ++) {
unserialize($seri);
}

$etime = microtime(true);

echo "unserialize :", ($etime – $stime),'<br/>’;
[/php]

2.测试结果:

json :150
serialize :224
json_encode :0.12014198303223
json_decode :0.23659014701843
serialize :0.10482311248779
unserialize :0.12682294845581

3.结果分析

(1)两者比较,字符串的长度json_encode具有优势;
(2)经过多次刷新测试,数据变化幅度不大,在循环10000次的条件下serialize函数均比json_decode所需时间短,但是优势很小,综合比较还是相差无几。

二、接下来测试一下一个较大且比较复杂的数组的情况下二者性能差别以及数据恢复之后的完整性等。
具体数组不再展示,流程基本一样。
1.测试结果:

json :11431
serialize :15748
json_encode :2.82439494133
json_decode :6.316869020462
serialize :4.2260599136353
unserialize :3.5953121185303

2.结果分析:

(1)当数组变大之后,json_encode依旧有字符串长度小的优势;
(2)json_encode过程挽回时间上的落差,基本只需要serialize一半;
(3)json_decode相比unserialize又是的两倍的时间,势均力敌!
(4)以上多次刷新测试数据变化幅度不大。

3.其他测试项目:

(1)json_decode/unserialize之后的数组与原数组相同,结构完整。(没有测试更复杂情况)

相比较来说,在我看来两者的性能是差不多的,基本持平。
至于选用哪一个,可根据以上数据具体分析选用,但是考虑到跨语言等方面,还是推荐json_encode,毕竟现在很多API都是json数据传输的。
4.2015-04-17更新

经过一些实际使用对比,发现json式序列化在存入数据后之后读取之时会出现json_decode后为null的情况,百度原因为BOM,由于我的数据比较复杂,没有用去除BOM的方式解决,只好换回serialize了,问题立马fixed!