PHP SPL标准库 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;
    }
    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);
}

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


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

时间: 2024-10-27 18:11:41

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

PHP SPL标准库之SplFixedArray使用实例_php实例

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 = m

PHP SPL标准库之SplFixedArray使用实例

  这篇文章主要介绍了PHP SPL标准库之SplFixedArray使用实例,SplFixedArray主要是处理数组相关的主要功能,它是固定长度的,比普通的数组处理更快,需要的朋友可以参考下 SplFixedArray主要是处理数组相关的主要功能,与普通php array不同的是,它是固定长度的,且以数字为键名的数组,优势就是比普通的数组处理更快. 看看我本机的Benchmark测试: ? 1 2 3 4 5 6 7 8 9 10 ini_set('memory_limit','12800M

PHP SPL标准库之数据结构栈(SplStack)介绍

  这篇文章主要介绍了PHP SPL标准库之数据结构栈(SplStack)介绍,栈(Stack)是一种特殊的线性表,因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈),需要的朋友可以参考下 栈(Stack)是一种特殊的线性表,因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈) SplStack就是继承双链表(SplDoublyLinkedList)实现栈. 类摘要如下: 简单使用如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

PHP SPL标准库中的常用函数介绍

  这篇文章主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions().spl_autoload_register().spl_autoload()三个函数,需要的朋友可以参考下 PHP SPL标准库中提供了一些函数用来处理如自动加载.迭代器处理等. spl_autoload_extensions()添加spl_autoload()可加载的文件扩展名 spl_autoload_register()注册函数到SPL __autoload函数栈中

PHP SPL标准库中的常用函数介绍_php技巧

PHP SPL标准库中提供了一些函数用来处理如自动加载.迭代器处理等. spl_autoload_extensions()添加spl_autoload()可加载的文件扩展名 spl_autoload_register()注册函数到SPL __autoload函数栈中. 复制代码 代码如下: /*test1.php*/ <?php class Test1 { }   /*test2.lib.php*/ <?php class Test2 { }   /*test.php*/ <?php /

PHP SPL标准库之数据结构栈(SplStack)介绍_php实例

栈(Stack)是一种特殊的线性表,因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈) SplStack就是继承双链表(SplDoublyLinkedList)实现栈. 类摘要如下: 简单使用如下: //把栈想象成一个颠倒的数组 $stack = new SplStack(); /** * 可见栈和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为: * (1)SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyL

PHP SPL标准库之数据结构堆(SplHeap)简单使用实例

  这篇文章主要介绍了PHP SPL标准库之数据结构堆(SplHeap)简单使用实例,本文还同时讲解了最大堆(SplMaxHeap).最小堆(SplMinHeap)的相关知识,需要的朋友可以参考下 堆(Heap)就是为了实现优先队列而设计的一种数据结构,它是通过构造二叉堆(二叉树的一种)实现.根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.二叉堆还常用于排序(堆排序). 如下:最小堆(任意节点的优先级不小于它的子节点) 看看PHP SplHeap的实现: 显然它是一个抽象类,

PHP SPL标准库之文件操作

  这篇文章主要介绍了PHP SPL标准库之文件操作(SplFileInfo和SplFileObject)实例,本文讲解SplFileInfo用来获取文件详细信息.SplFileObject遍历.查找指定行.写入csv文件等内容,需要的朋友可以参考下 PHP SPL中提供了SplFileInfo和SplFileObject两个类来处理文件操作. SplFileInfo用来获取文件详细信息: 代码如下: $file = new SplFileInfo('foo-bar.txt'); print_r

PHP SPL标准库之接口(Interface)详解

  这篇文章主要介绍了PHP SPL标准库之接口(Interface)详解,本文分别讲解了Coutable接口.OuterIterator接口.RecursiveIterator接口.SeekableIterator接口.SplObserver和SplSubject接口等内容,需要的朋友可以参考下 PHP SPL标准库总共有6个接口,如下: 1.Countable 2.OuterIterator 3.RecursiveIterator 4.SeekableIterator 5.SplObserv