Карта JavaScript намного медленнее, чем Object для случайных поисков?
Рассмотрим следующие два фрагмента (из этой записи jsperf):
let val = 0;
for(let i of indices) {
val += map.get(i);
}
// ---
let val = 0;
for(let i of indices) {
val += obj[i];
}
Вот, map
это Map
, obj
простой старый объект JavaScript (let obj = {}
), а также indices
это массив случайных индексов. И то и другое obj
а также map
были предварительно заполнены данными, поэтому поиск фактически возвращает данные. Проверьте jsperf для полного кода.
Вопрос:
Почему простой старый объект javascript превосходит Map
в 5 раз? Это просто потому, что на момент написания Map
Все еще очень новые и неоптимизированные? Или есть некоторые накладные расходы в Map
поиск, который всегда будет препятствовать тому, чтобы это было так быстро, как POJO?
Если он еще не оптимизирован, можем ли мы ожидать, что он будет быстрее, чем POJO для случайных поисков? Зачем? Почему бы и нет?
1 ответ
Спасибо @Bergi за этот ответ.
Причина, по которой простой объект JavaScript работал так хорошо в начальном jsperf по сравнению с Map
потому что под капотом движок JS может видеть, что мы используем объект как массив (последовательные целочисленные ключи), поэтому он "предполагает", что это массив, и может на его основе сделать кучу оптимизаций. Не так с Map
,
Но Map
имеет еще один недостаток в том, что требует вызова метода (map.get(p)
), в отличие от прямого поиска свойств (obj[p]
). Это не было (не может быть?) Оптимизировано, как показано этим jsperf: http://jsperf.com/map-vs-pojo-lookups