最近需要对大数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能测试。
在php5.2之前对数组存储的时候,大都使用serialize系列化。php5.2之后,开始内置了 JSON 的支持。
在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效。耳闻不如眼见,眼见不一定为实。那就用实际数据测试吧.....
我们先理解概念:
序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。
JSON,JavaScript Object Notation,一种更轻、更友好的用于接口(AJAX、REST等)数据交换的格式。 JSON是结构化数据串行化的文本格式,作为XML的一种替代品,用于表示客户端与服务器间数据交换有效负载的格式。它是从ECMAScript语言标准衍生而来的。JSON的设计目标是使它成为小的、轻便的、文本的,而且是JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。
JSON建构有两种结构:
1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
在PHP 5.3下执行:我们先使用小的数据做测试:
复制代码 代码如下:
<?php
$target = array (
"battle_id"=> 257
,"user_id"=> 41248
,"user_id2"=> 23989
,"player"=> 41248
,"formation"=> Array
(
"41248"=> 1
,"23989"=> 2
)
,"result"=> 1
,"battle_type"=> 1
,"speed"=> Array
(
"41248"=> 0
,"23989"=> 0
)
);
$json = json_encode($target);
$seri = serialize($target);
echo "json :" , strlen($json) ,"<br/>";
echo "serialize :", strlen($seri) ,"<br/>";
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++) {
json_encode($target);
}
$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/>";
//----------------------------------
$stime = microtime(true);
for ($i = 0; $i < 10000; $i ++) {
serialize($target);
}
$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/>";
?>
测试结果:
json :156
serialize :222
json_encode :0.1087498664856
json_decode :0.12652111053467
serialize :0.041656017303467
unserialize :0.040987968444824
测试结果看出json效率稍微比serialize差点,在php5.2可能会更差。应该是在php5.3之后,json扩展做了优化。
然后使用大数组做测试(代码放到最后,因为代码的数组比较长):
测试结果:
json :5350
serialize :8590
json_encode :0.90479207038879
json_decode :1.753741979599
serialize :1.3566699028015
unserialize :1.3003630638123
我们可以看出,serialize比json差了快一个数量级。
总结:
1) 空间的比较
serialize在编码后大概是json的1.5倍。
原因:
在大数据量的情况下,json比serialize稍微差一点
3)处理对象
json无法处理对象方法等数据。
4)使用范围
复制代码 代码如下:
<?php
$target = array (
"battle_id"=> 257
,"user_id"=> 41248
,"user_id2"=> 23989
,"player"=> 41248
,"formation"=> Array ("41248"=> 1 ,"23989"=> 2)
,"result"=> 1
,"battle_type"=> 1
,"speed"=> Array( "41248"=> 0,"23989"=> 0 )
,"attacker"=> Array(
"1"=> Array (
"user_id"=> 41248
,"soldier_id"=> 28
,"prototype_id"=> 4
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3997
,"hp"=> 3997
,"attack_general"=> 346
,"attack_skill"=> 596
,"attack_explode"=> 458
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 2
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0)
,"4"=> Array (
"user_id"=> 41248
,"soldier_id"=> 29
,"prototype_id"=> 2
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3555
,"hp"=> 3555
,"attack_general"=> 396
,"attack_skill"=> 581
,"attack_explode"=> 418
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0
)
,"5"=> Array (
"user_id"=> 41248
,"soldier_id"=> 30
,"prototype_id"=> 6
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3043
,"hp"=> 3043
,"attack_general"=> 351
,"attack_skill"=> 540
,"attack_explode"=> 474
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0)
,"7"=> Array (
"user_id"=> 41248
,"soldier_id"=> 37
,"prototype_id"=> 2
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3491
,"hp"=> 3491
,"attack_general"=> 393
,"attack_skill"=> 532
,"attack_explode"=> 456
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0 ))
,"defender"=> Array(
"2"=> Array(
"user_id"=> 23989
,"soldier_id"=> 24
,"prototype_id"=> 1
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3230
,"hp"=> 3230
,"attack_general"=> 390
,"attack_skill"=> 567
,"attack_explode"=> 442
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0)
,"5"=> Array(
"user_id"=> 23989
,"soldier_id"=> 25
,"prototype_id"=> 2
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3400
,"hp"=> 3400
,"attack_general"=> 379
,"attack_skill"=> 536
,"attack_explode"=> 405
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0 )
,"7"=> Array(
"user_id"=> 23989
,"soldier_id"=> 26
,"prototype_id"=> 6
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3669
,"hp"=> 3669
,"attack_general"=> 362
,"attack_skill"=> 549
,"attack_explode"=> 426
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0 )
,"9"=> Array(
"user_id"=> 23989
,"soldier_id"=> 27
,"prototype_id"=> 1
,"bid"=> 1
,"level"=> 1
,"rare"=> 1
,"skill_id"=> 1
,"totalhp"=> 3618
,"hp"=> 3618
,"attack_general"=> 326
,"attack_skill"=> 510
,"attack_explode"=> 419
,"attack_type"=> 1
,"defense"=> 0
,"anger"=> 50
,"dodge"=> 2
,"crit"=> 2
,"block"=> 0
,"block_effect"=> 0.5
,"crit_effect"=> 2
,"foramtion_effect"=> 0) )
,"battle_process"=> Array(
"0"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"1"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"2"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"3"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"4"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"5"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"6"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"7"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"8"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"9"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"10"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"11"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
,"defender_anger"=> Array("0"=> 94 )
,"skill"=> 0
,"state"=> 0
)
,"12"=> Array(
"user_id"=> 41248
,"asid"=> 28
,"bsid"=> Array( "0"=> 26 )
,"harm"=> Array("0"=> 1650)
,"dhp"=> Array("0"=> 2019 )
,"attacker_anger"=> 66
&nbs