php中serialize序列化与json性能测试的示例分析
最近需要对大数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能测试。
在php5.2之前对数组存储的时候,大都使用serialize系列化。php5.2之后,开始内置了 json 的支持。
在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效。耳闻不如眼见,眼见不一定为实。那就用实际数据测试吧.....
我们先理解概念:
一、 序列化
序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。 对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。
二、 json
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下执行:我们先使用小的数据做测试:
json :156 测试结果看出json效率稍微比serialize差点,在php5.2可能会更差。应该是在php5.3之后,json扩展做了优化。 然后使用大数组做测试(代码放到最后,因为代码的数组比较长): 测试结果: json :5350 总结: 1) 空间的比较 serialize在编码后大概是json的1.5倍。
原因: 在大数据量的情况下,json比serialize稍微差一点 3)处理对象 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
)
);
$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/>';
?>
测试结果:
serialize :222
json_encode :0.1087498664856
json_decode :0.12652111053467
serialize :0.041656017303467
unserialize :0.040987968444824
serialize :8590
json_encode :0.90479207038879
json_decode :1.753741979599
serialize :1.3566699028015
unserialize :1.3003630638123
我们可以看出,serialize比json差了快一个数量级。
json无法处理对象方法等数据。
<?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
,'defender_anger'=> array('0'=> 94 )
,'skill'=> 0
,'state'=> 0
)
,'13'=> 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
)
,'14'=> 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
)
,'15'=> 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
)
,'16'=> 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
)
,'17'=> 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
)
,'18'=> 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
)
,'19'=> 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
)
,'20'=>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
)
)
);
$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/>';
?>
推荐阅读
-
php中serialize序列化与json性能测试的示例分析
-
PHP中SERIALIZE和JSON序列化与反序列化的区别
-
php中serialize序列化与json性能测试的示例分析_php实例
-
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
-
php中serialize序列化与json性能测试的示例分析
-
php中serialize序列化与json性能测试的示例分析_PHP教程
-
php中serialize序列化与json性能测试的示例分析_php实例
-
php中serialize序列化与json性能测试的示例分析_PHP
-
php中serialize序列化与json性能测试的示例分析
-
php中serialize序列化与json性能测试的示例分析_PHP