php - 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
承诺具有更好的性能和内存吗?为什么会这样。那么究竟应该在什么情况下使用呢?
解决方案
是一种特殊类型的SplFixedArray
对象,通常表现为数组,但有以下限制:
- 与常规数组不同 -
SplFixedArray
具有固定大小。 - 与常规数组不同 -
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
对象上使用的类数组函数有关。