我正在测试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
对你有意义吗?
答案 0 :(得分:17)
正如this article的作者所做的基准所示:
可以得出结论,SplFixedArray的内存占用确实较小,但仅适用于大量数组元素。因为SplFixedArray在技术上也是an instance of a class,而不是传统的数组,这就是导致小数组实际上由SplFixedArray实现的内存消耗更多的原因,但是由于这个额外的几百个字节保持不变,它变得无关紧要随着数组大小的增长。
旁注:不要微观优化,不是每个钉都是为每个钉创造的。 SplFixedArray适用于极端情况,例如:对于数十万个元素的数组,每个元素减少几个字节的内存使用量对整体内存使用量有很大影响;但除非您确定您的阵列是或可能是应用程序的潜在瓶颈,否则不要费心使用它。
答案 1 :(得分: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
答案 2 :(得分:0)
是的,如果您使用固定大小的它们。
如果您不断更改要添加的每个新元素的大小,可能会比较慢,并且使用方法也可能不是错误的。
由于在PHP中实现了数组,因此速度更快,因为这些不是编程语言中按定义的实际数组,而是关联数组,使用哈希表实现。 (因此,PHP中的数组基本上是哈希表)
虽然SplFixedArray是使用C的“ malloc”作为几乎普通的C数组实现的,但是当然也封装在一个小的结构中,以根据使用情况跟踪和操纵该数组。