Я тестирую 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
Это имеет смысл для вас?
Как проиллюстрировано критериями, выполненными автором этой статьи :
Можно сделать вывод, что размер памяти SplFixedArray на самом деле меньше, но заметен только для большого количества элементов массива . Поскольку SplFixedArray является технически экземпляром класса , а в отличие от традиционных массивов, это то, что приводит к тому, что небольшие массивы становятся нагляднее потребляемыми в памяти, если они реализованы SplFixedArray, но поскольку эти дополнительные несколько сотен байтов остаются постоянными, это становится неуместным по мере увеличения размера массива.
Боковое примечание: не нужно оптимизировать микро, но не каждый молот создается для каждого гвоздя. SplFixedArray существует для крайних случаев, например, для массивов сотен тысяч элементов, где сокращение использования нескольких байтов памяти на элемент оказывает большое влияние на общее использование памяти; но не беспокойтесь, если вы действительно уверены, что ваш массив является или может быть потенциальным узким местом приложения.
Предполагается, что SplFixedArray быстрее, чем массивы. Он ничего не говорит о потреблении памяти (вот что вы здесь тестируете). С http://www.php.net/splfixedarray :
«Основные различия между 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