13

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

这对你有意义吗?

4

3 回答 3

19

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

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

可以得出结论,SplFixedArray 的内存占用确实更小,但仅在大量数组元素时才引人注目。因为从技术上讲,SplFixedArray 也是一个类的实例,与传统数组相反,如果由 SplFixedArray 实现,这就是导致小型数组实际上消耗更多内存的原因,但是由于这额外的几百字节保持不变,它变得无关紧要随着数组大小的增长。

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

于 2012-08-06T15:16:43.523 回答
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
于 2012-08-06T12:10:30.050 回答
2

是的,如果您使用固定尺寸的它们。

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

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

虽然 SplFixedArray 是使用 C 的“malloc”作为几乎普通的 C 数组来实现的,但当然包裹在一个小结构中以跟踪和操作数组作为每个用例。

更新

同时,从 PHP 7.x 开始,性能没有太大的时间差异。真正了解的唯一方法是根据您自己的用例进行基准测试。如果没有特殊要求,普通的PHParray就足够了。

于 2019-08-23T15:22:17.247 回答