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下执行:我们先使用小的数据做测试:

复制代码 代码如下:

    <?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/>; 

?>