php的serialize序列化和json性能测试
最近需要对⼤数组做存储,需要在serialize序列化和json之间做了选择。因此需要做了性能测试。
在php5.2之前对数组存储的时候,⼤都使⽤serialize系列化。php5.2之后,开始内置了的⽀持。
在⽹上看到有些资料说: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. (
phpjson格式化输出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_dec
ode的执⾏时间实际上上在⽤json_encode编码⼀段编码成JSON数据格式的字符串的执⾏时间。
实际上的json_decode的执⾏时间要⽐unserialize 长的多
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论