Проверка объекта на ключ более эффективна, чем поиск строки в массиве?

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

1) Используйте массив: keys = ['key1' , 'key2', 'key3']

Я могу создать массив, как это, а затем использовать jQuery.inArray(keyToCheck, keys) > -1 проверить и посмотреть, если keyToCheck в моем массиве.

2) Используйте объект: keys = {key1 : 1, key2 : 1, key3: 1}

Я могу создать этот объект, а затем использовать keys[keyToCheck] || 0 увидеть, если keyToCheck определено.

В чем я не уверен, так это в том, как поиск объекта реализован в javascript, и является ли он более эффективным, чем jQuery.inArray, который проходит через массив. Есть ли разница в производительности между этими методами? Использование jQuery не проблема для меня, так как у меня уже есть это в моем коде по другим причинам.

1 ответ

Решение

Задаваясь вопросом о производительности, можно получить ответ, протестировав несколько случаев на jsperf.
(Возможно, есть другой эталонный сайт, о котором я не знаю, пожалуйста, прокомментируйте, если вы знаете другой, я не имею в виду рекламу)

Для вашего случая я протестировал 3 метода:
- используя indexOf в массиве
- используя оператор "in"
- проверка значения свойства объекта

psperf здесь около 10 пунктов здесь: http://jsperf.com/key-or-array-search/2

Мы можем видеть, что использование значения свойства объекта в Firefox намного быстрее (> в 20 раз быстрее, чем в массиве, > в 5 раз, чем в).
В Safari все работает медленнее, чем в Firefox, но доступ к свойствам объекта более чем в два раза быстрее.
Но в Chrome я не понимаю, что происходит: все 3 метода довольно близки, но самый быстрый - это метод array/indexOf,...

Выступления часто бывают удивительными.

Обратите внимание, что результаты могут измениться - даже резко измениться - в зависимости от количества ключей (5, 20, 5000?), А также от вероятности того, что проверенный ключ находится в пределах набора.

Я задавался вопросом, как все изменится с массивом ключей длиной 500. Вот результаты: http://jsperf.com/key-or-array-search/3

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

Другие вопросы по тегам