Ассоциативный массив против SplObjectStorage - PullRequest
25 голосов
/ 15 декабря 2011

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

Тем не менее, я также стремлюсь использовать преимущества функциональности, добавленной в более современные версии PHP, такие как SplObjectStorage, для этого вместо этого, частично в качестве учебного процесса, отчасти потому, что он должен давать преимущества видно, что во многих случаях SplObjectStorage может работать быстрее, чем массивы).

В текущей реализации есть ассоциативный массив, который я проверяю с помощью in_array, чтобы увидеть, есть ли объект в массиве, прежде чем добавить в него новый объект.

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

Могу ли я использовать SplObjectStorage вместо ассоциативного массива? Если да, как определить ключ при добавлении нового объекта? Что еще более важно, каковы относительные преимущества и недостатки SplObjectStorage по сравнению с ассоциативными массивами?

Ответы [ 3 ]

25 голосов
/ 30 января 2012

Вы не должны видеть SplObjectStorage как хранилище значений ключей, а просто набор объектов . Что-то есть в наборе или нет, но его позиция не важна .

«Ключ» элемента в SplObjectStorage на самом деле является хешем объекта. Это делает невозможным добавление нескольких копий одного и того же экземпляра объекта в SplObjectStorage, поэтому перед добавлением вам не нужно проверять, существует ли копия.

Однако в PHP 5.4 есть новый метод, называемый getHash(), который вы можете переопределить, который будет возвращать «хэш» объекта. Это - в некотором смысле - возвращает / устанавливает ключ, чтобы вы могли разрешить его хранение в различных условиях.

Основным преимуществом SplObjectStorage является то, что вы получаете множество методов для взаимодействия и взаимодействия с различными наборами (contains(), removeAll(), removeAllExcept() и т. Д. ). Его скорость немного лучше, но использование памяти хуже , чем у обычных массивов PHP.

4 голосов
/ 08 октября 2015

Результаты после выполнения теста с 10000 итерациями на PHP 5.6.13:

+------------------+----------------+----------------+---------+
|       Type       |  Time to fill  | Time to check  | Memory  |
+------------------+----------------+----------------+---------+
| SplObjectStorage | 0.021285057068 | 0.019490000000 | 2131984 |
| Array            | 0.021125078201 | 0.020912000000 | 1411440 |
+------------------+----------------+----------------+---------+

Как видите, Array не заметно быстрее , чем SplObjectStorage, но использовать на 34% меньше памяти .

0 голосов
/ 21 апреля 2015

Когда вся память, выделенная массиву, израсходована, память, выделенная ему, будет удвоена.В этом контексте коллекция объектов может иметь более эффективную структуру.

...