当前位置:首页 > PHP教程 > php高级应用 > 列表

php中json和serialize 性能比较测试

发布:smiling 来源: PHP粉丝网  添加日期:2015-04-15 13:44:18 浏览: 评论:0 

php中json是实时交换数据的一个常用的数据传输模式了,而serialize是把字符转换成一个序列化字符串了,那么它们两的性能那个会更好一些呢?对此小编整理了一些json和serialize 性能比较测试例子供各位学习参考.

测试1

1,操作元素较少,单个元素比较大,英文,3个元素操作1000次,代码如下:

  1. $data = array('hello','word'); 
  2. $d = "helloword"
  3. $d = str_repeat($d, 10000); 
  4. //for($i = 0;$i $data[] = $d; 
  5. //} 
  6. //var_dump($data); 
  7. $jsonen_sarttime = getmicrotime(); 
  8. for($i=0;$i $json = json_encode($data); 
  9. echo "json长度:".strlen($json)." 
  10. n"; 
  11. $jsonen_endtime = getmicrotime(); 
  12. echo "jsonencode耗时:".($jsonen_endtime - $jsonen_sarttime)." 
  13. n"; 
  14. $jsonde_starttime = getmicrotime(); 
  15. for($i=0;$i $unjson = json_decode($json,true); 
  16. $jsonde_endtime = getmicrotime(); 
  17. echo "jsondecode耗时:".($jsonde_endtime - $jsonde_starttime)." 
  18. n"; 
  19. $seri1_starttime = getmicrotime(); 
  20. for($i=0;$i $serialize = serialize($data); 
  21. echo "serialize长度:".strlen($serialize)." 
  22. n"; 
  23. $seri1_endtime = getmicrotime(); 
  24. echo "serialize序列化耗时:".($seri1_endtime - $seri1_starttime)." 
  25. n"; 
  26. $seri2_starttime = getmicrotime(); 
  27. for($i=0;$i $unserialize = unserialize($serialize); 
  28. $seri2_endtime = getmicrotime(); 
  29. echo "serialize反序列化耗时:".($seri2_endtime - $seri2_starttime)." 
  30. n"; 
  31. /** 
  32. *获取时间记 
  33. * @return 
  34. */ 
  35. function getmicrotime(){ 
  36. list($usec$sec) = explode(" ",microtime()); 
  37. return ((float)$usec + (float)$sec); 
  38. //output: 
  39. json长度:90019 
  40. jsonencode耗时:1.0974299907684 
  41. jsondecode耗时:1.6237480640411 
  42. serialize长度:90052 
  43. serialize序列化耗时:0.025779962539673 
  44. serialize反序列化耗时:0.029321193695068 

可以看到json在做英文处理的时候,数组元素较少,体积要小于序列化的数据.处理效率低于序列化,将data 更改为如下代码:

  1. $data = array('hello','word'); 
  2. $d = "你好"
  3. $d = str_repeat($d, 10000); 
  4. //for($i = 0;$i $data[] = $d; 
  5. //output: 
  6. json长度:120019 
  7. jsonencode耗时:0.83260488510132 
  8. jsondecode耗时:2.2054090499878 
  9. serialize长度:60052 
  10. serialize序列化耗时:0.01835298538208 
  11. serialize反序列化耗时:0.01848292350769 

可以看到 json在做文字处理的时候,体积较大,处理效率也略低于序列化.

3.将数据更改为如下代码:

  1. $data = array('hello','word'); 
  2. $d = "你好"
  3. for($i = 0;$i $data[] = $d
  4. //output: 
  5. json长度:150016 
  6. jsonencode耗时:2.1428198814392 
  7. jsondecode耗时:6.5845320224762 
  8. serialize长度:198939 
  9. serialize序列化耗时:2.8011980056763 
  10. serialize反序列化耗时:4.6967668533325 

可以看到json体积略小于serialize.

4.将data修改为如下代码:

  1. $data = array('hello','word'); 
  2. $d = "hello"
  3. for($i = 0;$i $data[] = $d
  4. //output: 
  5. json长度:80016 
  6. jsonencode耗时:1.6437809467316 
  7. jsondecode耗时:4.5136170387268 
  8. serialize长度:188939 
  9. serialize序列化耗时:2.909558057785 
  10. serialize反序列化耗时:4.4678349494934 

测试2

以一个包含1000000个元素的数组做为原始数据,分别以json,serialize,igbinary进行序列化和反向操作,代码如下:

  1. <?php 
  2. ini_set('memory_limit''512m'); 
  3. $array = array_fill(0, 1000000, rand(1, 9999)); 
  4. $start = microtime(true); 
  5. $export = json_encode($array); 
  6. $end = microtime(true); 
  7. $duration = $end - $start
  8. print('JSON Encode: ' . $duration . PHP_EOL); 
  9. $start = microtime(true); 
  10. $import = json_decode($export); 
  11. $end = microtime(true); 
  12. $duration = $end - $start
  13. print('JSON Decode: ' . $duration . PHP_EOL); 
  14. $start = microtime(true); 
  15. $export = serialize($array); 
  16. $end = microtime(true); 
  17. $duration = $end - $start
  18. print('Serialize: ' . $duration . PHP_EOL); 
  19. $start = microtime(true); 
  20. $import = unserialize($export); 
  21. $end = microtime(true); 
  22. $duration = $end - $start
  23. print('Serialize: ' . $duration . PHP_EOL); 
  24. $start = microtime(true); 
  25. $export = igbinary_serialize($array); 
  26. $end = microtime(true); 
  27. $duration = $end - $start
  28. print('Igbinary Serialize: ' . $duration . PHP_EOL); 
  29. $start = microtime(true); 
  30. $import = igbinary_unserialize($export); 
  31. $end = microtime(true); //开源软件:phpfensi.com 
  32. $duration = $end - $start
  33. print('Igbinary Serialize: ' . $duration . PHP_EOL); 
  34. ?> 
  35. //测试结果 
  36. JSON Encode: 0.084825992584229 
  37. JSON Decode: 0.34976410865784 
  38. Serialize: 0.38241410255432 
  39. Serialize: 7.7904229164124 
  40. Igbinary Serialize: 0.046916007995605 
  41. Igbinary Serialize: 0.23396801948547 

从测试结果来看,速度方面优先级排列为 igbinary > json > serialize。同时我们也可以看到,php原生的serialize在对大对象进行反向操作时,速度真是掉队一大截了.

占用字节数对比

json:5000001

serialize:15888902

igbinary:7868681

在没有中文字符的情况下,json胜出,igbinary次之,serialize又被甩了几条街.

结论:

如果只是英文和数字,元素比较平均,则推荐json,体积和效率均优于序列化.

如果只是英文和数字,个别元素较大,则推荐serialize效率优于序列化.

如果中文,元素较少,推荐序列化,体积和效率均优于json.

如果中文,元素比较平均,推荐json.

如果是缓存业务,效率越高越好,如果是缓存数据,体积越小越好,也要看具体的场景.

Tags: json serialize php性能测试

分享到: