【问题标题】:Is lodash _.size() faster than JS length property?lodash _.size() 比 JS 长度属性快吗?
【发布时间】:2015-06-23 22:50:20
【问题描述】:

文章(下面的链接)建议在字符串上使用长度属性会创建一个对象引用,这会不必要地减慢函数的速度。

http://www.webreference.com/programming/javascript/jkm3/2.html

在这种情况下,使用 lodash _.size() 有什么好处?它的性能与(本机...?)长度属性有什么不同吗?

如果您要计算对象中的数组或键,使用 lodash 大小而不是长度属性有什么好处?

【问题讨论】:

  • 我对那篇文章的结论持怀疑态度,所以我尝试复制基准,但没有得到可比的结果;我得到的时间是 2.25 和 2.14 微秒。我怀疑作者很久以前就运行了他们的测试,并使用了现在非常慢的机器、非常过时的 JavaScript 实现,或两者兼而有之。这不是我现在会担心的事情。

标签: javascript size lodash


【解决方案1】:

从 lodash 来源,_.size() 实现为:

function size(collection) {
  var length = collection ? getLength(collection) : 0;
  return isLength(length) ? length : keys(collection).length;
}

对于数组,第一行间接执行collection.length,因此_.size() 会慢一点(如果有的话)。

在性能文章中,性能问题是当堆栈上的数字可以用于实现相同目标时,使用了length 的属性查找。换句话说,解决方案不是寻找更快的属性,而是在可能的情况下完全避免使用该属性。

【讨论】:

    【解决方案2】:

    size() 函数在链中最有用,当您需要结果的大小时。使用value() 来解压所有内容以获取大小是没有意义的。例如:

    _(_.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() 是关于代码简洁性,而不是性能。

    【讨论】:

      【解决方案3】:

      https://www.measurethat.net/Benchmarks/Show/17859/3/native-filterlength-vs-lodash-sumby-vs-lodash-filtersiz 表示截至 2022 年 3 月 22 日,array.filter(testFunction).length 比在 Firefox 和 Chrome 上使用 lodash(如 _(array).filter(testFunction).size())更快。

      该链接还显示了一种更快的方法来做同样的事情。我假设更快的方法更快,因为它不需要像filter()array.filter(testFunction).length 中那样创建一个新数组并将过滤后的元素添加到该数组中。

      【讨论】:

        猜你喜欢
        • 2011-02-13
        • 1970-01-01
        • 2013-02-12
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多