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

Isr*_*sra 11 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 
Run Code Online (Sandbox Code Playgroud)

使用传统阵列:

<?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
Run Code Online (Sandbox Code Playgroud)

这对你有意义吗?

Mah*_*ahn 17

正如本文作者所做的基准测试所示:

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

可以得出结论,SplFixedArray的内存占用确实较小,但仅对大量数组元素有明显的影响.因为SplFixedArray在技术上是一个类的实例,而不是传统的数组,这就是导致小数组实际上由SplFixedArray实现的内存消耗更多的原因,但是由于这个额外的几百个字节保持不变,它变得无关紧要随着数组大小的增长.

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


per*_*lis 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
Run Code Online (Sandbox Code Playgroud)
$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
Run Code Online (Sandbox Code Playgroud)

  • 但通常SplFixedArrays确实具有较小的内存占用. (3认同)