加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

了解 PHP 的SplFixedArray标准库,以及其与Array比较在性能表现方面的优势

发布时间:2023-09-14 10:52:46 所属栏目:PHP教程 来源:
导读:SPL - Standard PHP Library,标准PHP类库,本文我们来看看SPL标准库之数据结构SplFixedArray,及SplFixedArray和Array的性能测试对比.

SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定
SPL - Standard PHP Library,标准PHP类库,本文我们来看看SPL标准库之数据结构SplFixedArray,及SplFixedArray和Array的性能测试对比.

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

看看我本机的Benchmark测试:

ini_set('memory_limit','12800M'); 
 
for($size = 10000; $size < 10000000; $size *= 4) { 
    echo PHP_EOL . "Testing size: $size" . PHP_EOL; 
    for($s = microtime(true), $container = Array(), $i = 0; $i < $size; $i++) $container[$i] = NULL; 
    echo "Array(): " . (microtime(true) - $s) . PHP_EOL; 
 
    for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) $container[$i] = NULL; 
    echo "SplArray(): " . (microtime(true) - $s) . PHP_EOL; 

 
//结果如下: 
 
Testing size: 10000 
Array(): 0.004000186920166 
SplArray(): 0.0019998550415039 
 
Testing size: 40000 
Array(): 0.017001152038574 
SplArray(): 0.0090007781982422 
 
Testing size: 160000 
Array(): 0.050002098083496 
SplArray(): 0.046003103256226 
 
Testing size: 640000 
Array(): 0.19701099395752 
SplArray(): 0.16700983047485 
 
Testing size: 2560000 
Array(): 0.75704312324524 
SplArray(): 0.67303895950317 
通常情况下SplFixedArray要比php array快上20%~30%,所以如果你是处理巨大数量的固定长度数组,还是强烈建议使用.

SplFixedArray类摘要如下:

SplFixedArray  implements Iterator   , ArrayAccess   , Countable   { 
    /* 方法 */ 
    public __construct  ([ int $size  = 0  ] ) 
    public int count  ( void ) 
    public mixed current  ( void ) 
    public static SplFixedArray fromArray  ( array $array  [, bool $save_indexes  = true  ] ) 
    public int getSize  ( void ) 
    public int key  ( void ) 
    public void next  ( void ) 
    public bool offsetExists  ( int $index  ) 
    public mixed offsetGet  ( int $index  ) 
    public void offsetSet  ( int $index  , mixed  $newval  ) 
    public void offsetUnset  ( int $index  ) 
    public void rewind  ( void ) 
    public int setSize  ( int $size  ) 
    public array toArray  ( void ) 
    public bool valid  ( void ) 
    public void __wakeup  ( void ) 

使用SplFixedArray:

$arr = new SplFixedArray(4); 
$arr[0] = 'php'; 
$arr[1] = 1; 
$arr[3] = 'python'; 
 
//遍历, $arr[2] 为null 
foreach($arr as $v) { 
    echo $v . PHP_EOL; 

 
//获取数组长度 
echo $arr->getSize(); //4 
 
//增加数组长度 
$arr->setSize(5); 
$arr[4] = 'new one'; 
 
//捕获异常 
try{ 
    echo $arr[10]; 
} catch (RuntimeException $e) { 
    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,下面是测试代码:

<?php 
function pr() { 
    $params = func_get_args(); 
    $env = php_sapi_name(); 
    if ("cli" == $env) { 
        foreach ($params as $key => $value) { 
            echo $value; 
        } 
    } else { 
        foreach ($params as $key => $value) { 
            echo "<pre>"; 
            print_r($value); 
            echo "</pre>"; 
        } 
    } 
} // 用来打印输出结果 
 
 
<?php 
require dirname(__FILE__)."/function.php"; 
 
for ($size=1000; $size<=50000000; $size*=2) { 
    pr(PHP_EOL . "Testing size: $size" . PHP_EOL);  
    for($s = microtime(true), $container = Array(), $i = 0; $i < $size; $i++) { 
        $container[$i] = NULL;  
    }  //Cuoxin.com 
    pr( "Array(): " . (microtime(true) - $s) . PHP_EOL);  
 
    for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) { 
        $container[$i] = NULL;  
    } 
    pr("SplArray(): " . (microtime(true) - $s) . PHP_EOL);  

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章