Действительно ли SplFixedArray работает лучше, чем массивы?

Я тестирую 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

Это имеет смысл для вас?

Ответ 1

Как показано в тестах автора в этой статье:

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

Можно сделать вывод, что размер памяти SplFixedArray действительно меньше, но заметен только для большого количества элементов массива. Поскольку SplFixedArray технически экземпляр класса, а также, в отличие от традиционных массивов, это то, что приводит к тому, что небольшие массивы на самом деле выглядят более значительными для памяти если реализовано SplFixedArray, но поскольку эти дополнительные несколько сотен байтов остаются постоянными, это становится неуместным по мере увеличения размера массива.

Боковое примечание: не микро-оптимизируйте, не каждый молот создан для каждого гвоздя. SplFixedArray существует для крайних случаев, например. для массивов сотен тысяч элементов, где сокращение использования нескольких байтов памяти на элемент оказывает большое влияние на общее использование памяти; но не беспокойтесь, если вы действительно уверены, что ваш массив является или может быть потенциальным узким местом приложения.

Ответ 2

Предполагается, что SplFixedArray быстрее, чем массивы. Он ничего не говорит о потреблении памяти (это то, что вы тестируете здесь). С http://php.net/manual/en/class.splfixedarray.php:

"Основное различие между SplFixedArray и обычным массивом PHP состоит в том, что SplFixedArray имеет фиксированную длину и допускает в качестве индексов только целые числа в пределах диапазона. Преимущество состоит в том, что он обеспечивает более быструю реализацию массива"

Однако использование массива из 100000 записей показывает, что он также использует меньше оперативной памяти:

$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

да, если вы используете их с фиксированным размером.

Если вы постоянно меняете размер каждого нового элемента, добавляемый может быть медленнее, и это также может быть неправильным использованием.

Благодаря реализации массива в PHP быстрее, это не реальный массив в соответствии с определением в языках программирования, а ассоциативный массив, реализованный с помощью хэш-таблицы. (поэтому массивы в PHP - это в основном хеш-таблицы)

Хотя SplFixedArray реализован с использованием "malloc" C как почти нормального массива C, он, конечно, обернут в небольшую структуру, чтобы отслеживать и манипулировать массивом в соответствии с вариантами использования.