Является ли lodash _.size() быстрее, чем свойство длины JS?
Статья (ссылка ниже) предполагает, что использование свойства length в строке создает ссылку на объект, которая излишне замедляет функцию вниз.
http://www.webreference.com/programming/javascript/jkm3/2.html
В этом контексте, в чем преимущество использования lodash _.size()? Выполняет ли оно что-либо иначе, чем свойство length (native...?)?
Если вы подсчитываете массив или ключи в объекте, можно ли использовать размер lodash вместо свойства length?
Ответы
Ответ 1
Из источников _.size()
реализуется как:
function size(collection) {
var length = collection ? getLength(collection) : 0;
return isLength(length) ? length : keys(collection).length;
}
Для массива первая строка косвенно выполняет collection.length
так что _.size()
, если вообще, немного (крошечный) бит медленнее.
В статье о производительности проблема производительности заключается в том, что поиск свойств length
используется, когда число в стеке могло быть использовано для достижения той же цели. Другими словами, решение заключалось не в поиске более быстрого свойства, а во избежании полного его использования, когда это можно было бы сделать.
Ответ 2
Функция size() наиболее полезна в цепочках, когда вам нужен размер результата. Нет смысла распаковывать все, используя значение(), чтобы получить размер. Например:
_(_.range(10))
.filter(function(item) { return item % 2; })
.size();
В отличие от более длинной формы:
_(_.range(10))
.filter(function(item) { return item % 2; })
.value()
.length;
Эта функция также облегчает поиск размера объекта:
_.size({ a: 1, b: 2 });
В отличие от:
Object.keys({ a: 1, b: 2 }).length;
size()
- это краткость кода, а не производительность.