Доступ к массиву лучше через числовой или ассоциативный ключ? - PullRequest
4 голосов
/ 22 марта 2012

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

//extract array from a db table (not real code)
$array = $query->executeAndFetchAssociative;

$window_start = 0;

for($i = $window_start; $i<count($array) && $i<$window_start+10; $i++)
  echo($entry["db_field"]);

Это своего рода пагинатор для веб-интерфейса. Я получаю значение windows_start и отображаю следующие 10 значений.

Концептуальное исполнение:

  1. Получить номер windows_start
  2. Запустить цикл ввода массива window_start-TH внешнего массива
  3. Вывести значение поля внутреннего массива через ассоциативный индекс
  4. Переместить в window_start + 1

Внутренние массивы имеют около 40 полей. Внешний массив может сильно вырасти, поскольку он представляет таблицу базы данных. Теперь я вижу, что когда внешний массив становится больше, выполнение над окнами 10 занимает все больше и больше времени.

Мне нужна некоторая «теория производительности» в моем коде:

Если я введу значения внутренних массивов с помощью цифровой клавиши, могу ли я иметь более высокую производительность? В целом, более быстрый доступ к значениям массива с числовым индексом, чем доступ с ассоциативным индексом (строка)?

Сколько стоит ввод случайной записи ($ array [random_num]) массива длины N? O (N), O (N / 2) только для примера

Наконец, скорость итерации по массиву зависит от длины массива? Я имею в виду, что я всегда перебираю 10 элементов массива, но как длина массива влияет на мою итерацию фиксированной длины?

Спасибо Альберто

Ответы [ 2 ]

8 голосов
/ 22 марта 2012

Если я введу значения внутренних массивов с помощью цифровой клавиши, могу ли я лучшая производительность? Как правило, более быстрый доступ к значениям массива с числовым индексом, чем доступ с ассоциативным индексом (строка)?

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

Сколько стоит ввод случайной записи ($ array [random_num]) массив длины N? O (N), O (N / 2) только для примера

Массивы в PHP реализованы через хеш-таблицы, что означает, что вставка амортизируется O (1) - почти все вставки - O (1), но некоторые могут быть O (n). Кстати, O (n) и O (n / 2) - это одно и то же; Возможно, вы захотите вернуться к тексту об алгоритмической сложности.

Наконец, скорость итерации по массиву зависит от массива длина? Я имею в виду, что я всегда перебираю 10 элементов массива, но как влияет ли длина массива на мою итерацию фиксированной длины?

Нет, длина массива не имеет значения.

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

Вы должны переместить логику подкачки в саму базу данных, включив смещение и ограничение в ваш запрос SQL.

3 голосов
/ 22 марта 2012

Преждевременная оптимизация - корень всего зла.Дополнительные числовые и ассоциативные массивы имеют совершенно другое семантическое значение и поэтому обычно не являются взаимозаменяемыми.И последнее, но не менее важное: нет. Массивы в PHP реализованы в виде хэш-карт, и доступ к ним по ключу всегда O(1)

В вашем случае (разбиение на страницы) гораздо полезнее выбирать только те элементы, которые вы хотите отобразитьвместо того, чтобы выбрать все и нарезать их позже.Для этого в SQL есть LIMIT 10 OFFSET 20 -синтаксис.

...