(为什么)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.
因此,您为了可读性和易用性牺牲了一点速度。
我被
我也比较了建议的解决方案:
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.
因此,您为了可读性和易用性牺牲了一点速度。