(为什么)lodash 慢?

(Why) Is lodash slow?

我被 and supported by this benchmark that compares that solution (native JavaScript) with 中描述的结果惊呆了。

我也比较了建议的解决方案:

const obj = {
  name: undefined,
  age: 15,
  school: 'Some school'
}

const hasOnly = (obj,props) => {
    var objProps = Object.keys(obj)
    return objProps.length == props.length && props.every(p => objProps.includes(p))
}

console.log(hasOnly(obj,['name','age'])) //return false
console.log(hasOnly(obj,['name','age','city'])) //return false
console.log(hasOnly(obj,['name','age','school'])) //return true

其中一个我真正简单地从每个本机函数切换到 Lodash 中的相应函数,

hasOnly = (obj,props) => {
    const objProps = _.keys(obj)
    return _.size(objProps) == _.size(props) && _.every(_.includes(objProps), props);
}

and the result is still disappointly in favour of the native solution.

现在,上面的例子可能是一个愚蠢的例子,但仍然...> 90% 慢?那我用 Lodash 做什么?我的意思是,在不同的场景中,它可以提高可读性,特别是当必须部分应用和传递函数时,Lodash 使您免于很多 x => x.(经典示例 arrayOfarrays.map(_.map(fOnTheElements)) 而不是 arrayOfarrays.map(arr => arr.map(fOnTheElements))), 但如果性能如此之低,那么要使表现力足以选择 Lodash 而不是本机代码就有点困难了。

我是 JavaScript 和 Lodash 的新手(只是对函数式编程不是全新的),所以我什至不知道链接答案中使用的基准测试工具的可靠性,但我真不敢相信它会做出如此糟糕的工作来扭转结果。

Lodash 就是 javascript。没有什么魔法可以让它比编写它的本机代码更快。

简而言之,每个方法调用都有开销。所以如果我这样做

const len = myArr.length

你也是

const len = _.size(myArr);

我们假设 _.size 的实现是

function size(arr){
    return arr.length
}

(它做的不止这些,但请继续关注我!)那么至少你有一个额外的方法调用,而本机解决方案没有。

事实上_.size确实even more than just check the length

Gets the size of collection by returning its length for array-like values or the number of own enumerable string keyed properties for objects.

因此,除了额外的方法调用之外,您还有用于检查“可枚举字符串键控属性的数量”的代码 - 本机解决方案更快,这真的有什么奇怪的吗?


那么为什么要使用像 lodash 这样的库呢?因为作为他们的文档标题:

Lodash makes JavaScript easier by taking the hassle out of working with arrays, numbers, objects, strings, etc.

因此,您为了可读性和易用性牺牲了一点速度。