首页 > 开发 > PHP > 正文

Array和SplFixedArray比较(代码示例)

2024-05-04 22:02:17
字体:大 中 小
来源:转载
供稿:网友

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.  
  15.     $arr[] = $i; 
  16.  
  17. } 
  18.  
  19. $writeTime = microtime(true) - $writeTime; 
  20.  
  21.    
  22.  
  23. $readTime = microtime(true); 
  24.  
  25. for($i = 0; $i < TEST_COUNT; ++$i) 
  26.  
  27. { 
  28.  
  29.     $value = $arr[$i]; 
  30.  
  31. } 
  32.  
  33. $readTime = microtime(true) - $readTime; 
  34.  
  35. $memory = memory_get_usage() - $memory; 
  36.  
  37. echo '[Array]', PHP_EOL, 'Memory: ', $memory, ' bytes', PHP_EOL, 'Write Time: ', $writeTime, 's', PHP_EOL, 'Read Time: ', $readTime, 's', PHP_EOL; 
  38.  
  39.    
  40.  
  41. $memory = memory_get_usage(); 
  42.  
  43. $writeTime = microtime(true); 
  44.  
  45. $splFixedArray = new SplFixedArray(TEST_COUNT); 
  46.  
  47. for($i = 0; $i < TEST_COUNT; ++$i) 
  48.  
  49. { 
  50.  
  51.     $splFixedArray[$i] = $i; 
  52.  
  53. } 
  54.  
  55. $writeTime = microtime(true) - $writeTime; 
  56.  
  57.    
  58.  
  59. $readTime = microtime(true); 
  60.  
  61. for($i = 0; $i < TEST_COUNT; ++$i) 
  62.  
  63. { 
  64.  
  65.     $value = $splFixedArray[$i]; 
  66.  
  67. } 
  68.  
  69. $readTime = microtime(true) - $readTime; 
  70.  
  71. $memory = memory_get_usage() - $memory; 
  72.  
  73. 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更加适合一些。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表