徐善通的随笔

千里之行, 始于足下



PHP SplFixedArray 和 array区别和对比


PHP SplFixedArray 和 array

官方文档: https://www.php.net/manual/zh/class.splfixedarray.php

SplFixedArray提供索引数组的功能,它与普通数组的区别就是具有固定长度,且只能存放索引数组, 使用前必须先定义长度

好处就是在处理大数据的数组量, 速度更快, 占用内存更小,更接近c数组,但是因为还要存储php中的一些结构及gc回收等,内存利用远远不如c语言

使用示例

// 普通数组
$s = memory_get_usage(); $st = microtime(true);

$array = [];
for ($i = 0; $i < 1000000; $i++) {
    $array[] = $i;
}
$e = memory_get_usage(); $et = microtime(true);
echo sprintf('普通数组, 存储100万条数据占用%fMB内存, 耗时%f<br/>', ($e-$s) / 1024 / 1024, $et - $st);

// SplFixedArray
$s = memory_get_usage(); $st = microtime(true);

$fixedArray = new \SplFixedArray(1000000);
for ($i = 0; $i < 1000000; $i++) {
    $fixedArray[$i] = $i;
}
$e = memory_get_usage(); $et = microtime(true);
echo sprintf('使用SplFixedArray, 存储100万条数据占用%fMB内存, 耗时%f<br/>', ($e-$s) / 1024 / 1024, $et - $st);


// 读取耗时
$st = microtime(true);
foreach ($array as $v) {

}
$et = microtime(true);
echo sprintf('普通数组, 遍历100万条数据耗时%f<br/>', ($et-$st));

$st = microtime(true);
foreach ($fixedArray as $v) {

}
$et = microtime(true);
echo sprintf('使用SplFixedArray, 遍历100万条数据耗时%f<br/>', ($et-$st));

测试结果

普通数组, 存储100万条数据占用32.003983MB内存, 耗时0.056648
使用SplFixedArray, 存储100万条数据占用15.261864MB内存, 耗时0.050642

普通数组, 遍历100万条数据耗时0.013640
使用SplFixedArray, 遍历100万条数据耗时0.026134

多次测试下来, fixedArray 内存占用要比普通数组小一半, 写入速度要比变通数组快一点
但是读取速度还是普通数组快一些

分享一篇文章, 对数组的内存具体占用讲解的特别好
传送门: https://m.ituring.com.cn/article/498349


作者: 徐善通
地址: https://www.xstnet.com/article-141.html
声明: 除非本文有注明出处,否则转载请注明本文地址


我有话说



最新回复


正在加载中....

Copyrights © 2016-2019 醉丶春风 , All rights reserved. 皖ICP备15015582号-1