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

Array和SplFixedArray比较(代码示例)

发布:smiling 来源: PHP粉丝网  添加日期:2020-04-16 20:36:16 浏览: 评论:0 

PHP 的精髓就是数组的运用,数组玩得好可以用于所有数据结构。有个叫SPL的好东西,里面有很多数据结构可供我们使用,并且性能也比我们使用数组实现的要好很多。

今天来看看SplFixedArray,顾名思义,固定大小的数组。实例化时,指定数组大小,使用过程中不可对数组进行扩容、缩小。

所以如果你有对数组进行动态操作时,可能就不太适合用它,而且SplFixedArray的索引只能是数字,不可以作为键值数组使用。

下面是测试Array和SplFixedArray的 100W 次读写性能以及内存占用,代码:

  1. <?php 
  2.  
  3. define('TEST_COUNT', 1000000); 
  4.  
  5. $memory = memory_get_usage(); 
  6.  
  7. $writeTime = microtime(true); 
  8.  
  9. $arr = []; 
  10.  
  11. for($i = 0; $i < TEST_COUNT; ++$i
  12.  
  13.  
  14.     $arr[] = $i
  15.  
  16.  
  17. $writeTime = microtime(true) - $writeTime
  18.  
  19.    
  20.  
  21. $readTime = microtime(true); 
  22.  
  23. for($i = 0; $i < TEST_COUNT; ++$i
  24.  
  25.  
  26.     $value = $arr[$i]; 
  27.  
  28.  
  29. $readTime = microtime(true) - $readTime
  30.  
  31. $memory = memory_get_usage() - $memory
  32.  
  33. echo '[Array]', PHP_EOL, 'Memory: '$memory' bytes', PHP_EOL, 'Write Time: '$writeTime's', PHP_EOL, 'Read Time: '$readTime's', PHP_EOL; 
  34.  
  35.    
  36.  
  37. $memory = memory_get_usage(); 
  38.  
  39. $writeTime = microtime(true); 
  40.  
  41. $splFixedArray = new SplFixedArray(TEST_COUNT); 
  42.  
  43. for($i = 0; $i < TEST_COUNT; ++$i
  44.  
  45.  
  46.     $splFixedArray[$i] = $i
  47.  
  48.  
  49. $writeTime = microtime(true) - $writeTime
  50.  
  51.    
  52.  
  53. $readTime = microtime(true); 
  54.  
  55. for($i = 0; $i < TEST_COUNT; ++$i
  56.  
  57.  
  58.     $value = $splFixedArray[$i]; 
  59.  
  60.  
  61. $readTime = microtime(true) - $readTime
  62.  
  63. $memory = memory_get_usage() - $memory
  64.  
  65. echo '[SplFixedArray]', PHP_EOL, 'Memory: '$memory' bytes', PHP_EOL, 'Write Time: '$writeTime's', PHP_EOL, 'Read Time: '$readTime's', PHP_EOL; 

运行结果:

  1. [Array] 
  2.  
  3. Memory: 33558608 bytes 
  4.  
  5. Write Time: 0.083034038543701s 
  6.  
  7. Read Time: 0.022516965866089s 
  8.  
  9. [SplFixedArray] 
  10.  
  11. Memory: 16003208 bytes 
  12.  
  13. Write Time: 0.037343978881836s 
  14.  
  15. Read Time: 0.022947072982788s 

结论:

内存占用:SplFixedArray 比 Array 能节省一半多的内存

写入性能:SplFixedArray 比 Array 更快

读取性能:五五开,多次测试下来 Array 读取速度甚至更快一些

如果你能确定只需要使用索引数组,并且能预测该数组的成员数,那显然用SplFixedArray更加适合一些。

Tags: Array SplFixedArray

分享到: