Php SplFixedArray是否真的比阵列性能更好?

Php SplFixedArray是否真的比阵列性能更好?,php,arrays,performance,spl,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_g

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

SplFixedArray应该比数组快。它没有说明内存消耗(这是您在这里测试的)。发件人:

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=array();
对于($i=0;$i rand(),'name'=>'default');
}
回波存储器获取峰值使用率(真)//返回31457280

$users=新的SplFixedArray(100000);
对于($i=0;$i rand(),
“名称”=>“默认值”);
}
回波存储器获取峰值使用率(真)//返回26738688

如以下作者执行的基准测试所示:

我们可以得出这样的结论:SplFixedArray的内存占用确实更小,但仅在大量数组元素中才明显。由于SplFixedArray在技术上也很好,与传统阵列相反,这就是为什么如果由SplFixedArray实现,小型阵列实际上会消耗更多内存的原因,但由于这额外的数百字节保持不变,因此随着阵列大小的增加,它变得无关紧要


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

如果您使用的是固定大小的阵列,则可以

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

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

虽然SplFixedArray是使用C的“malloc”作为一个几乎正常的C数组来实现的,但它当然被包装在一个小的结构中,以根据用例跟踪和操作数组

更新

同时,由于PHP7.x,性能上没有太大的时差。 了解真实情况的唯一方法是基于您自己的用例进行基准测试。
如果没有特殊要求,普通的PHP
数组就足够了。

您的创建对象和数组。。。你想要什么???数组可能太小,无法理解差异。尝试对更大的阵列进行基准测试,这就是SplFixedArray的用途。但一般来说,SplFixedArray的内存占用确实更小。你是对的,我测试了它并用结果更新了我的答案,很高兴知道。“优点是它使用的内存比标准数组少。”除性能外的另一个用例是使用SplFixedArray表示意图,告诉代码读者这确实是一个数组,而不是哈希表或其他任何东西。所以我认为SplifiedArray不仅仅适用于“极端情况”。
$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