Почему в PHP нет массива произвольного доступа? - PullRequest
1 голос
/ 06 октября 2011

Массив PHP на самом деле является упорядоченной картой, которая связывает значения с ключами .Доступ к случайным числовым индексам значительно медленнее, чем в таких языках, как Java.Даже доступ к массиву Javascript значительно быстрее, чем к PHP.Я испытал медлительность PHP, когда программировал решения Sudoku на сервере и, наконец, переключился на Python, который также был быстрее PHP.

В чем причина того, что PHP не предоставляет надлежащий массив произвольного доступа (для числовыхиндексы)?

Для уточнения: я не говорю о случайных записях.Я имею в виду прямой доступ через вычисляемые индексы, например, имеющий массив a из 81 значения (доска Судоку) и прямой доступ к любому значению a[i] без поиска карты.

Ответы [ 5 ]

3 голосов
/ 06 октября 2011

Может быть, один из типов массивов SPL подойдет вам лучше?

Страница PHP SPL

Редактировать: Если присмотреться более подробно, SplFixedArray будет хорошим выбором для реализации судоку, в которой вы будете знать размер массива. Само по себе говорит, что это будет быстрее. Однако, как говорили другие, не глядя на алгоритм, как мы можем быть уверены, что проблема была в массивах?

Сравнение производительности массива против SplFixedArray

SPL - расшифровывается как стандартная библиотека PHP, ничего страшного

3 голосов
/ 06 октября 2011

Это просто разница в языковом оформлении.Трудно сравнить «язык X» быстрее, чем «язык Y» с точки зрения чего-то вроде решателя судоку.Прирост производительности действительно сводится к реализации.

Однако массивы PHP хранятся внутри как упорядоченные хеши .

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

1 голос
/ 06 октября 2011

Массив с внутренними индексами 0 .. length - 1, теоретически, является просто частным случаем ассоциативных массивов , а именно ассоциативного массива с ключами 0 .. length - 1.

Конечно, алгоритм поиска более сложен, и обычно вы не можете получить O (1) в худшем случае. Но вы получаете бронированный O (1) при условии, что хеш-функция и реализация хеш-таблицы являются хорошими (и в широко используемых реализациях языка, где это фундаментальный тип данных, это, вероятно, так). Кроме того, вполне возможно использовать (неассоциативный) массив за кулисами для хеш-таблиц, когда большинство или все ключи являются целыми числами, что исключает 90% накладных расходов при работе с этими индексами. Lua 5 делает это, я не знаю, делают ли это и текущие версии PHP.

Если всего этого недостаточно, и поиск все еще слишком медленный для вашей цели, тогда применяется другой ответ: улучшите ваш алгоритм. (Действительно. Не переходите к другим опциям легкомысленно.) Вы также можете найти библиотеку, которая предоставляет такую ​​возможность (хотя сомнительно, действительно ли она быстрее, особенно если она написана на PHP), или вы можете переместить вычислительно сложные части в другой язык (и если вам нужно сделать , что , вы можете также пройти весь путь и написать его на C). Но обычно хеш-таблица должна быть достаточно быстрой.

1 голос
/ 06 октября 2011

Полагаю, php был задуман как движок шаблонов для html-страниц.Он должен быть очень простым и очень простым в использовании, со всеми необходимыми конструкциями / функциями, необходимыми для типичного веб-приложения, итерациями по полям базы данных и т. Д. ...

Скорость никогда не была проблемой для приложений php, поскольку файловые системы, доступ к базам данных и веб-сервисы обычно медленнее, чем одна только обработка php-процессора.

0 голосов
/ 06 октября 2011

Это зависит от того, как вы пытались это рандомизировать. Если вы использовали большую для цикла, вы не должны удивляться, что это было медленно. Используйте rand() для этой цели

...