#php #arrays #performance #key
#php #массивы #Производительность #Клавиша
Вопрос:
У меня есть вопрос относительно производительности массива…. как php обрабатывает ключи массива? Я имею в виду, если я сделаю что-то вроде $my_city = $cities[15];
…. получает ли php прямой доступ к точному элементу строки в $cities
массиве или php выполняет итерацию по массиву, пока не найдет соответствующую строку?
и если он обращается к строке напрямую … есть ли разница в производительности между массивом из 100 строк и массивом из 100 000 строк?
как в этом примере $my_city = $cities[15];
Комментарии:
1. это может вам немного помочь: blog.red-stars.net/uncategorized/php-array-performance
Ответ №1:
Массивы PHP реализованы в виде хэш-таблиц, поэтому доступ к элементам осуществляется как можно более напрямую, без повторения всего. Подробнее об алгоритме читайте здесь: http://en.wikipedia.org/wiki/Hash_table
Комментарии:
1. Я думаю, что хэш-таблица более уместна в случае с ассоциативным массивом (со значениями пары ключей).
2. @Artem Поскольку в PHP существует только один тип массива, я подозреваю, что реальной разницы нет (хотя я не уверен в этом на 100%). Массивы с числовой индексацией — это просто ассоциативные массивы с числовыми ключами.
Ответ №2:
Он обращается к ней напрямую. За сценой все сводится к арифметике указателей на память. Я с трудом могу поверить, что концепция или реализация массива в PHP каким-то образом отличается от других языков, таких как C, Java или C #.
Ответ №3:
Это также зависит от того, что находится внутри массива.
// $my_city is a reference to the variable
$cities[15] = new stdobj();
$my_city = $cities[15];
// $my_city is a copy of the array row
$cities[15] = 'foobar';
$my_city = $cities[15];
Возможно, это не прямой ответ на ваш вопрос, но ссылка на объект обычно использует меньше памяти, чем переменная copy.
Ответ №4:
всегда существует очевидная разница в производительности между массивом из 100 строк и массивом из 100 000 строк
Комментарии:
1. В правильно реализованном алгоритме хэширования это должно практически не иметь значения.
2. по крайней мере, потребуется больше времени для инициализации и потребления большего объема памяти. и такая навигация по хэшу тоже будет вам кое-чего стоить.
3. Время чистого доступа на самом деле не будет зависеть от размера массива. Инициализация или потребление памяти самим массивом не имеют значения.