php中serialize序列化与json性能测试的示例分析_php教程-查字典教程网
php中serialize序列化与json性能测试的示例分析
php中serialize序列化与json性能测试的示例分析
发布时间:2016-12-29 来源:查字典编辑
摘要:最近需要对大数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能测试。在php5.2之前对数组存储的时候,大都...

最近需要对大数组做存储,需要在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下执行:我们先使用小的数据做测试:

复制代码 代码如下:

<?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倍。

原因:

serialize后字符串包含了子串的长度,这可能是速度方面的优化,但是测试结果不尽人意。 serialize有更加详细的类型区分,而json只有四种类型,并且是以简单的符号表示。 2)速度的比较 在较小数据的情况下,serialize比json快数量级。

在大数据量的情况下,json比serialize稍微差一点

3)处理对象

json无法处理对象方法等数据。

4)使用范围

序列化使用serialize,特别是对象的存储。这是其存在的意义。 与对象无关的数据存储可以使用json,如包含大量数字的数组等。 在前后端交互一般都使用JSON,另外,目前JSON只支持UTF-8编码的数据。

复制代码 代码如下:

<?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教程学习
    热门php教程学习
    编程开发子分类