SplFixedArray真的比数组表现更好吗?

时间:2012-08-06 11:50:05

标签: php arrays performance spl

我正在测试SplFixedArray构建一个包含一周中几天的数组,我得到以下结果:

<?php

$days = new SplFixedArray(7);

$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";

echo memory_get_peak_usage() . "\n"; //Returns 327688
echo memory_get_usage() . "\n"; //Returns 327140
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288 

使用传统阵列:

<?php

$days = array();

$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";

echo memory_get_peak_usage() . "\n"; //Returns 327528
echo memory_get_usage() . "\n"; //Returns 326820
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288

对你有意义吗?

3 个答案:

答案 0 :(得分:17)

正如this article的作者所做的基准所示:

http://www.johnciacia.com/wp-content/uploads/2011/01/3.png

可以得出结论,SplFixedArray的内存占用确实较小,但仅适用于大量数组元素。因为SplFixedArray在技术上也是an instance of a class,而不是传统的数组,这就是导致小数组实际上由SplFixedArray实现的内存消耗更多的原因,但是由于这个额外的几百个字节保持不变,它变得无关紧要随着数组大小的增长。

旁注:不要微观优化,不是每个钉都是为每个钉创造的。 SplFixedArray适用于极端情况,例如:对于数十万个元素的数组,每个元素减少几个字节的内存使用量对整体内存使用量有很大影响;但除非您确定您的阵列是或可能是应用程序的潜在瓶颈,否则不要费心使用它。

答案 1 :(得分:9)

SplFixedArray应该比数组更快。它没有说内存消耗(这是你在这里测试的)。来自http://php.net/manual/en/class.splfixedarray.php

  

“SplFixedArray和普通PHP数组之间的主要区别   是SplFixedArray是固定长度,只允许整数   在范围内作为索引。优点是它允许更快   数组实现“

但是,使用100000个条目的数组,表明它也使用更少的RAM:

$users = array();
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(), 'name' => 'default');
}
echo memory_get_peak_usage(true); //returns 31457280

$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(),
            'name' => 'default');
}
echo memory_get_peak_usage(true); //return 26738688

答案 2 :(得分:0)

是的,如果您使用固定大小的它们。

如果您不断更改要添加的每个新元素的大小,可能会比较慢,并且使用方法也可能不是错误的。

由于在PHP中实现了数组,因此速度更快,因为这些不是编程语言中按定义的实际数组,而是关联数组,使用哈希表实现。 (因此,PHP中的数组基本上是哈希表)

虽然SplFixedArray是使用C的“ malloc”作为几乎普通的C数组实现的,但是当然也封装在一个小的结构中,以根据使用情况跟踪和操纵该数组。

相关问题