时时商务社区

标题: php中serialize序列化与json性能测试的示例分析 [打印本页]

作者: xgnic    时间: 2018-2-14 08:22

            最近需要对大数组做存储,需要在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下执行:我们先使用小的数据做测试:
[U]复制代码[/U] 代码如下:
     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) ,'
';   
    echo "serialize :", strlen($seri) ,'
';   
    $stime = microtime(true);   
    for ($i = 0; $i     
测试结果:
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倍。
原因:
[U]
serialize后字符串包含了子串的长度,这可能是速度方面的优化,但是测试结果不尽人意
serialize有更加详细的类型区分,而json只有四种类型,并且是以简单的符号表示。
2)速度的比较
在较小数据的情况下, serialize比json快数量级。
在大数据量的情况下,json比serialize稍微差一点
3)处理对象
json无法处理对象方法等数据。
4)使用范围
[U]
序列化使用serialize,特别是对象的存储。这是其存在的意义。
与对象无关的数据存储可以使用json,如包含大量数字的数组等。
[U]
在前后端交互一般都使用JSON,另外,目前JSON只支持UTF-8编码的数据。[/U][/U][/U]
[U]复制代码[/U] 代码如下:
  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) ,'
';  
echo "serialize :", strlen($seri) ,'
';  
$stime = microtime(true);  
for ($i = 0; $i     
            
            
您可能感兴趣的文章:
  • PHP中的串行化变量和序列化对象
  • 解析PHP多种序列化与反序列化的方法
  • php序列化函数serialize() 和 unserialize() 与原生函数对比
  • PHP的serialize序列化数据以及JSON格式化数据分析
  • 详解PHP序列化反序列化的方法
  • 总结对比php中的多种序列化
  • PHP多种序列化/反序列化的方法详解
  • PHP数组式访问接口ArrayAccess用法分析
  • PHP迭代器接口Iterator用法分析
  • PHP聚合式迭代器接口IteratorAggregate用法分析
  • PHP检测接口Traversable用法详解
  • PHP自定义序列化接口Serializable用法分析
            




    欢迎光临 时时商务社区 (http://bbs.4435.cn/) Powered by Discuz! X3.2