Проверка объекта на ключ более эффективна, чем поиск строки в массиве?
Я создаю структуру данных, которая будет содержать то, что я буду использовать для многократной проверки, чтобы определить, определены ли определенные значения. Я придумала два возможных решения, и мне интересно, какое из них более эффективно, или есть ли лучший способ, чем оба:
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
Мы видим, что массив побежден из-за большого количества ключей.
Таким образом, вы должны прояснить ситуацию, в которой вы находитесь.
С небольшим подсчетом ключей затраты на обработку свойства делают массив выигрышным.
С большим количеством ключей стоимость итерации в массиве делает свойство выигрышным...