Карта 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

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