SplFixedArray比普通数组真的更快吗?

16

我正在测试 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

你觉得这有意义吗?


你要创建对象和数组...你想要什么? - voodoo417
4
这个数组可能太小,无法体现出差异。尝试对更大的数组进行基准测试,这正是SplFixedArray的用途。 - Mahn
3个回答

20

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

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

可以得出结论,SplFixedArray的内存占用确实更小,但仅在大量数组元素的情况下才会有明显效果。由于SplFixedArray从技术上讲也是一个类实例,与传统数组相比,它可能会导致小型数组实际上占用更多内存,但由于这额外的几百字节保持不变,随着数组大小的增长而变得无关紧要。

副作用:不要过度优化,不是每个锤子都适合每个钉子。 SplFixedArray适用于极端情况,例如对于数十万个元素的数组,每个元素减少几个字节的内存使用将对整体内存使用产生巨大影响。但是,除非您确信数组是或可能成为应用程序的潜在瓶颈,否则不要使用它。


1
除了性能之外,使用SplFixedArray的另一个用例是表达意图,告诉代码读者这确实是一个数组,而不是哈希表或任何其他东西。因此,我认为SplFixedArray不仅仅适用于“极端情况”。 - Olle Härstedt

10
一个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

3
通常情况下,SplFixedArray确实具有较小的内存占用。 - Mahn
你说得对,我测试了一下并更新了我的答案,很高兴知道这个结果。 - periklis
1
优点是它使用的内存比标准数组少。 - costa

2

如果您使用固定大小的数组,则是的。

如果您不断更改每个新元素的大小,可能会变慢,而且这可能也不是错误的用法。

由于PHP中的数组实现方式,它们不是编程语言中的真正数组,而是使用哈希表实现的关联数组(因此PHP中的数组基本上是哈希表),所以速度更快。

而SplFixedArray则是使用C语言的“malloc”作为几乎正常的C数组来实现的,当然还包装在一个小结构体中,以便按照用例跟踪和操作数组。

更新

同时,自PHP 7.x以来,在性能方面没有太大差异。唯一了解真正性能的方法是根据自己的用例进行基准测试。如果没有特殊要求,则普通的PHP array已经足够好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接