Эффективность JavaScript-объекта и массива

Какова разница в производительности между получением значения по ключу в объекте JavaScript и итерацией по массиву отдельных объектов JavaScript?

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

Причина, по которой я спрашиваю об этом, заключается в том, что я хотел бы использовать модуль angular-ui-select для выбора пользователей, но я не могу использовать этот модуль с Javascript-объектом - для этого требуется массив.

Насколько я могу пожертвовать, переключившись с поиска по ключу, на поиск по итерации?

Ключ:

var user = users[id];

Итерацией

var user;

for (var i = 0; i < users.length; i ++) {
  if (users[i].id == id) { 
    user = users[i]; break;
  }
}

Ответ 1

Ответ на этот вопрос зависит от браузера, однако на jsperf.com есть несколько тестов производительности по этому вопросу. Это также сводится к размеру ваших данных. Как правило, быстрее использовать пары ключ-значение объекта, когда у вас большие объемы данных. Для небольших наборов данных массивы могут быть быстрее.

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

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

Тест:

http://jsben.ch/#/Y9jDP

Ответ 2

Эта проблема затрагивает все языки программирования. Это зависит от многих факторов:

  • размер вашей коллекции -arrays будет медленнее, если вы ищете последний ключ, а массив довольно длинный. Элементы
  • могут повторяться, если да, чем вам нужен массив. Если нет: вам нужен либо словарь (карта), либо вам нужно написать метод добавления, который для каждого добавления будет итерировать ваш массив и найти возможные дубликаты, что может быть проблематичным при работе с большими списками.
  • среднее использование ключа - вы потеряете производительность, если самый запрошенный userId находится в конце списка.

В вашем примере карта будет лучшим решением. Во-вторых, вам нужно добавить разрыв в код yor:)

var user;

for (var i = 0; i < users.length; i ++) {
  if (users[i].id == id) {
     user = users[i]; break;
  }
}

Или вы потеряете производительность:)

Ответ 3

ассоциативные массивы намного медленнее, чем массивы с нумерованными индексами, потому что ассоциативные массивы работают путем выполнения строковых сравнений, которые намного медленнее, чем сравнения чисел!