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

PHP SPL标准库 SplFixedArray 介绍及和Array的性能测试

发布:smiling 来源: PHP粉丝网  添加日期:2015-05-09 09:58:20 浏览: 评论:0 

SPL - Standard PHP Library,标准PHP类库,本文我们来看看SPL标准库之数据结构SplFixedArray,及SplFixedArray和Array的性能测试对比.

SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快.

看看我本机的Benchmark测试:

  1. ini_set('memory_limit','12800M'); 
  2.  
  3. for($size = 10000; $size < 10000000; $size *= 4) { 
  4.     echo PHP_EOL . "Testing size: $size" . PHP_EOL; 
  5.     for($s = microtime(true), $container = Array(), $i = 0; $i < $size$i++) $container[$i] = NULL; 
  6.     echo "Array(): " . (microtime(true) - $s) . PHP_EOL; 
  7.  
  8.     for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size$i++) $container[$i] = NULL; 
  9.     echo "SplArray(): " . (microtime(true) - $s) . PHP_EOL; 
  10.  
  11.  
  12. //结果如下: 
  13.  
  14. Testing size: 10000 
  15. Array(): 0.004000186920166 
  16. SplArray(): 0.0019998550415039 
  17.  
  18. Testing size: 40000 
  19. Array(): 0.017001152038574 
  20. SplArray(): 0.0090007781982422 
  21.  
  22. Testing size: 160000 
  23. Array(): 0.050002098083496 
  24. SplArray(): 0.046003103256226 
  25.  
  26. Testing size: 640000 
  27. Array(): 0.19701099395752 
  28. SplArray(): 0.16700983047485 
  29.  
  30. Testing size: 2560000 
  31. Array(): 0.75704312324524 
  32. SplArray(): 0.67303895950317 

通常情况下SplFixedArray要比php array快上20%~30%,所以如果你是处理巨大数量的固定长度数组,还是强烈建议使用.

SplFixedArray类摘要如下:

  1. SplFixedArray  implements Iterator   , ArrayAccess   , Countable   { 
  2.     /* 方法 */ 
  3.     public __construct  ([ int $size  = 0  ] ) 
  4.     public int count  ( void ) 
  5.     public mixed current  ( void ) 
  6.     public static SplFixedArray fromArray  ( array $array  [, bool $save_indexes  = true  ] ) 
  7.     public int getSize  ( void ) 
  8.     public int key  ( void ) 
  9.     public void next  ( void ) 
  10.     public bool offsetExists  ( int $index  ) 
  11.     public mixed offsetGet  ( int $index  ) 
  12.     public void offsetSet  ( int $index  , mixed  $newval  ) 
  13.     public void offsetUnset  ( int $index  ) 
  14.     public void rewind  ( void ) 
  15.     public int setSize  ( int $size  ) 
  16.     public array toArray  ( void ) 
  17.     public bool valid  ( void ) 
  18.     public void __wakeup  ( void ) 

使用SplFixedArray:

  1. $arr = new SplFixedArray(4); 
  2. $arr[0] = 'php'
  3. $arr[1] = 1; 
  4. $arr[3] = 'python'
  5.  
  6. //遍历, $arr[2] 为null 
  7. foreach($arr as $v) { 
  8.     echo $v . PHP_EOL; 
  9.  
  10. //获取数组长度 
  11. echo $arr->getSize(); //4 
  12.  
  13. //增加数组长度 
  14. $arr->setSize(5); 
  15. $arr[4] = 'new one'
  16.  
  17. //捕获异常 
  18. try{ 
  19.     echo $arr[10]; 
  20. } catch (RuntimeException $e) { 
  21.     echo $e->getMessage(); 

SplFixedArray和Array的性能测试

PHP文档专门说明:

The SplFixedArray class provides the main functionalities of array. The main differences between a SplFixedArray and a normal PHP array is that the SplFixedArray is of fixed length and allows only integers within the range as indexes. The advantage is that it allows a faster array implementation.

所以在处理大型的、以数字为索引的数组时,应该用SplFixedArray来代替普通Array,下面是测试代码:

  1. <?php 
  2. function pr() { 
  3.     $params = func_get_args(); 
  4.     $env = php_sapi_name(); 
  5.     if ("cli" == $env) { 
  6.         foreach ($params as $key => $value) { 
  7.             echo $value
  8.         } 
  9.     } else { 
  10.         foreach ($params as $key => $value) { 
  11.             echo "<pre>"
  12.             print_r($value); 
  13.             echo "</pre>"
  14.         } 
  15.     } 
  16. // 用来打印输出结果 
  17.  
  18.  
  19. <?php 
  20. require dirname(__FILE__)."/function.php"
  21.  
  22. for ($size=1000; $size<=50000000; $size*=2) { 
  23.     pr(PHP_EOL . "Testing size: $size" . PHP_EOL);  
  24.     for($s = microtime(true), $container = Array(), $i = 0; $i < $size$i++) { 
  25.         $container[$i] = NULL;  
  26.     }  //phpfensi.com 
  27.     pr( "Array(): " . (microtime(true) - $s) . PHP_EOL);  
  28.  
  29.     for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size$i++) { 
  30.         $container[$i] = NULL;  
  31.     } 
  32.     pr("SplArray(): " . (microtime(true) - $s) . PHP_EOL);  

但是在我的测试机器上,这段代码出现了非常诡异的结果:

暂时想不出来是什么原因:难道是因为虚拟机内存太小,导致最后的SplFixedArray插入时需要不断GC才导致时间太长?

Tags: SPL标准库 SplFixedArray

分享到: