那些技术php的serialize序列化和json性能测试(上)

Posted 荧客网络

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些技术php的serialize序列化和json性能测试(上)相关的知识,希望对你有一定的参考价值。

最近需要对大数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能

php5.2之前对数组存储的时候,大都使用serialize系列化。php5.2之后,开始内置了  的支持

在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效。耳闻不如眼见,眼见不一定为实。那就用实际数据测试吧.....

我们先理解概念:

一、 序列化

序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

将对象的状态信息转换为可以存储或传输的窗体的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

 

二、 JSON

JSON Object Notation,一种更轻、更友好的用于接口(AJAX、REST等)数据交换的格式。 JSON是结构化数据串行化的文本格式,作为XML的一种替代品,用于表示客户端与服务器间数据交换有效负载的格式。它是从ECMAScript语言标准衍生而来的。JSON的设计目标是使它成为小的、轻便的、文本的,而且是javascript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于家族的习惯(包括C, C++,C#, , JavaScript, Perl, 等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

JSON建构有两种结构:
1. “
名称/对的集合(Acollection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hashtable),有键列表(keyedlist),或者关联数组associativearray)。


2.
值的有序列表(Anordered list of values)。在大部分语言中,它被理解为数组(array)。

测试:

三、 实际测试

 5.3下执行:我们先使用小的数据做测试:

[php]   

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快数量级。

量的情况下,jsonserialize稍微差一点

·         

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

·         

4)使用范围

·         

·        序列化使用serialize,特别是对象的存储。这是其存在的意义。

·        与对象无关的数据存储可以使用json,如包含大量数字的数组等。

·         

·         

·        在前后端交互一般都使用JSON,另外,目前JSON只支持UTF-8编码的数据。

 




未完待续



每周更新

网络+生活,一个闲着没事爱逗你的公众号


以上是关于那些技术php的serialize序列化和json性能测试(上)的主要内容,如果未能解决你的问题,请参考以下文章

serialize和json_encode 区别

ctf serialize 序列化和反序列化

PHP变量处理之serialize

序列化与JSON

将 PHP 对象图序列化/反序列化为 JSON

php serialize的长度问题,大神来