首页 > 解决方案 > PHP SplFixedArray 错误或性能缓慢?

问题描述

所以我制作了这个简单的脚本来测试SplFixedArray对象,看看它的性能如何。

使用数组的传统方法

ini_set('memory_limit', '2048M');
$start    = microtime(true);
$memStart = memory_get_peak_usage(true);
$loop     = 1000000;
$array    = [];

for ($i = 0; $i < $loop; ++$i) {
    $arr       = ['a'];
    $array[$i] = $arr;
}

$end    = microtime(true);
$memEnd = memory_get_peak_usage(true);
echo 'Time: ' . ($end - $start) . "\n";
echo 'Mem: ' . ($memEnd - $memStart) / 1024 / 1024 . 'Mb';

//Display: Time: 0.037514925003052 Mem: 28Mb

SplFixedArray

ini_set('memory_limit', '2048M');
$start    = microtime(true);
$memStart = memory_get_peak_usage(true);
$loop     = 1000000;
$array    = new SplFixedArray($loop);

for ($i = 0; $i < $loop; ++$i) {
    $arr       = new SplFixedArray(1);
    $arr[0]    = 'a';
    $array[$i] = $arr;
}

$end    = microtime(true);
$memEnd = memory_get_peak_usage(true);
echo 'Time: ' . ($end - $start) . "\n";
echo 'Mem: ' . ($memEnd - $memStart) / 1024 / 1024 . 'Mb';

//Display: Time: 0.21888899803162 Mem: 142Mb (slower by 5x)

从文档中,不是SplFixedArray承诺具有更好的性能和内存吗?为什么会这样。那么究竟应该在什么情况下使用呢?

标签: phpperformance

解决方案


是一种特殊类型的SplFixedArray对象,通常表现为数组,但有以下限制:

  1. 与常规数组不同 -SplFixedArray具有固定大小。
  2. 与常规数组不同 -SplFixedArray的键只能是整数。

由于这两个特点 - 数组上的方法的实现SplFixedArray可以更快。

至于您的示例 - 请注意,在第二个示例中,您创建了 100000 个新SplFixedArray对象(与第一个示例不同,您仅创建了 1 个数组)。

SplFixedArray以您的示例为例-当在循环中删除 new 的创建时,只需将值设置a为数组的每个元素-这就是我得到的:

$start = microtime(true);
$memStart = memory_get_peak_usage(true);
$loop = 100000;
$array = new SplFixedArray($loop);


for ($i = 0; $i<$loop; $i++) {
    $array[$i] = 'a';
}

$end = microtime(true);
$memEnd = memory_get_peak_usage(true);
echo "Time: " . ($end - $start) . "\n";
echo "Mem: " . ($memEnd - $memStart)/1024/1024 . 'Mb';

// Time: 0.0023539066314697 Mem: 2Mb

请注意,我更改为 microtime

这里要记住的另一件重要的事情 - 文档中提到的“更快的数组实现”与可以在SplFixedArray对象上使用的类数组函数有关。


推荐阅读