【发布时间】:2011-09-16 21:48:26
【问题描述】:
我正在试验 SplFixedArray。我对动态数组做了一些工作,我正在尝试将其转换为内存效率更高的固定数组(可使用的 RAM 有限)。
阅读了一些 PHP 文档,在 Title 中找到了该函数,然后将其应用于一个数组,如下所示:
$array[x][y]['field']
(以字符串为索引的3d数组,在固定数组中不可能)通过做
$testArray = SplFixedArray::fromArray(generateArray(256));
// generateArray is a function to create the array and set it to zero.
我检查了我是否可以从这个与标准数组相比节省一些内存,但没有。用数字替换了字符串索引,使用相同数量的 ram (94 mb) 来生成数组。
如果我正确使用 SplFixedArray(不是从现有数组转换),我将使用的内存降低到 74mb,但我有很多函数和规则可以与基本 3d 数组一起使用,转换起来会很麻烦一切都“正确”的固定数组。这就是为什么当我读到 SPL::fromArray 时,我跳到了我的椅子上。但是通过这些测试,我发现零内存和速度优势。
我没有正确使用它吗?这个功能只适用于其他类型的东西吗?
谢谢!
【问题讨论】:
-
单个 256 个元素的数组根本不够大,无法利用 SPLFixedArray 更有效的结构。
-
SplFixedArray 只是节省了一些数组键,而不是值。仍然有很多 PHP zval 开销。与普通 PHP 数组的区别在于,它是一个纯索引列表,而不是字典。但是速度优势并没有体现出来,因为该功能受到阻碍,解释器针对普通数组/字典进行了优化。
-
见matthewturland.com/2010/05/20/new-spl-features-in-php-5-3 - 答案是:这取决于你在做什么以及你在那里获得了多少数据。 SplFixedArray 可以显着提高性能。
-
其实数组是3D的,值的总数是256*256*5。
-
请注意,在这种情况下,您将创建 1+256*256 个 SplFixedArray 对象,每个对象都会消耗典型的 PHP 开销。我刚刚测试过,当使用带有整数的那个大小的 3D SplFixedArray 时,内存使用量是 55M,但是当使用平面 2D SplFixedArray[256 * 256 * 5] 时,内存使用量是 19M。所以它表明如果你想最小化内存使用,你需要最小化 PHP 对象的数量。