Действительно ли 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

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


person Isra    schedule 06.08.2012    source источник
comment
ваш объект создания и массив... что вы хотите???   -  person voodoo417    schedule 06.08.2012
comment
Массив, вероятно, слишком мал, чтобы оценить разницу. Попробуйте сравнить большие массивы, для этого в любом случае и нужен SplFixedArray.   -  person Mahn    schedule 06.08.2012


Ответы (3)


Как показано в тестах, выполненных автором этой статьи :

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

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

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

person Mahn    schedule 06.08.2012
comment
Другим вариантом использования, кроме производительности, было бы использование SplFixedArray для выражения намерения, сообщая читателю кода, что это действительно массив, а не хеш-таблица или что-то еще. Так что я бы сказал, что SplFixedArray не только для крайних случаев. - person Olle Härstedt; 26.02.2020

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

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

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

$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
person periklis    schedule 06.08.2012

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

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

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

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

ОБНОВЛЕНИЕ

В то же время начиная с PHP 7.x разницы во времени в производительности нет. Единственный способ узнать это на самом деле — это провести тест, основанный на ваших собственных сценариях использования. Если нет особых требований, вполне достаточно обычного PHP array.

person Raffaello    schedule 23.08.2019