zoukankan      html  css  js  c++  java
  • 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下执行:我们先使用小的数据做测试:

    1. <?php    
    2. $target = array (    
    3.    'battle_id'=> 257    
    4.    ,'user_id'=> 41248    
    5.    ,'user_id2'=> 23989    
    6.    ,'player'=> 41248    
    7.    ,'formation'=> Array    
    8.         (    
    9.            '41248'=> 1    
    10.            ,'23989'=> 2    
    11.         )    
    12.     
    13.    ,'result'=> 1    
    14.    ,'battle_type'=> 1    
    15.    ,'speed'=> Array    
    16.         (    
    17.            '41248'=> 0    
    18.            ,'23989'=> 0    
    19.         )    
    20.         );    
    21.     
    22. $json = json_encode($target);    
    23. $seri = serialize($target);    
    24.     
    25. echo "json :" , strlen($json) ,'<br/>';    
    26. echo "serialize :"strlen($seri) ,'<br/>';    
    27.     
    28. $stime = microtime(true);    
    29. for ($i = 0; $i < 10000; $i ++) {    
    30.     json_encode($target);    
    31. }    
    32. $etime = microtime(true);    
    33.     
    34. echo "json_encode :", ($etime - $stime) ,'<br/>';    
    35.     
    36. //----------------------------------    
    37.     
    38. $stime = microtime(true);    
    39. for ($i = 0; $i < 10000; $i ++) {    
    40.    json_decode($json,true);    
    41. }    
    42. $etime = microtime(true);    
    43.     
    44. echo "json_decode :", ($etime - $stime),'<br/>';    
    45.     
    46. //----------------------------------    
    47. $stime = microtime(true);    
    48. for ($i = 0; $i < 10000; $i ++) {    
    49.     serialize($target);    
    50. }    
    51. $etime = microtime(true);    
    52.     
    53. echo "serialize :", ($etime - $stime) ,'<br/>';    
    54.     
    55. //----------------------------------    
    56. $stime = microtime(true);    
    57. for ($i = 0; $i < 10000; $i ++) {    
    58.     unserialize($seri);    
    59. }    
    60. $etime = microtime(true);    
    61.     
    62. echo "unserialize :", ($etime - $stime),'<br/>';    
    63.     
    64. ?>    



    测试结果:

    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编码的数据。
      补充:测试代码有误,在测试json_decode效率时,错写成了json_encode,所以测试结果中json_decode的执行时间实际上上在用json_encode编码一段编码成JSON数据格式的字符串的执行时间。
    实际上的json_decode的执行时间要比unserialize 长的多
  • 相关阅读:
    'try(A a = new A())' VS 'try finally'
    pom中更换阿里云仓库时不要忽略了pluginRepositories
    dubbo-spring-boot的auto-configure示例报Not found exported service的解决办法
    前后端分离部署时如何保护前端代码不被匿名访问
    拒绝一次性买卖:MyBatis的mapper和repository可重复生成工具
    关于el-dialog,我更推荐的用法
    SqlServer导入数据到MySql
    ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
    如何优化游标--使用只读游标
    多台路由器上网配置
  • 原文地址:https://www.cnblogs.com/smallgo/p/3197077.html
Copyright © 2011-2022 走看看