【问题标题】:Are there performance reasons to prefer size over length or count in Ruby?在 Ruby 中是否有性能原因更喜欢大小而不是长度或计数?
【发布时间】:2019-04-28 01:10:00
【问题描述】:

Airbnb's Ruby Style Guide 中的一条建议如下:

出于性能原因,首选size 而不是lengthcount

这些性能原因是什么?

【问题讨论】:

  • 对于Enumeratorsize 尝试计算大小,而count 实际上通过遍历整个集合来计算元素。
  • count 更适合与块或参数一起使用,例如collection.count { |x| x.price > 10 }
  • @Kimmo,是的,count 更适合与块或参数一起使用,但是 sizelength 既不带参数也不带块。 :-)
  • @stefan 是的。尝试像 p (1..200).to_a.combination(9).size 这样的东西让我惊喜不已,它几乎立即返回 1175445251780800。

标签: ruby methods collections


【解决方案1】:

这似乎有点错误,对于最常用的情况(ArrayHashString),sizelength 要么是别名,要么以相同的方式实现(您可以阅读更多here 或检查每个方法的实现)并将在O(1) 中运行。

count 然而:

  • 对于Hash,没有重新定义,将回退到Enumerable#count,这意味着它的复杂性将是O(n),因为所有的键值都会被遍历。
  • 对于Array,它被重新定义(Array#count),至少它会检查给定的参数数量,这是Array#sizeArray#length都不需要做的事情。
  • 对于String,它用于计算子字符串。

总而言之,我会这么说

出于性能原因,首选sizelength 而不是count

会更准确。

【讨论】:

  • 您提供的链接中的一个答案提供了指向this article 的链接,我认为这很有帮助。
  • 请记住,AirBNB 本质上是一个 Rails 应用程序,所以他们的风格指南很可能也是针对这一点的。从 AR 的角度来看,count 是一个查询执行,其中大小取决于Array#size,因此使用大小的开销远低于Select COUNT(*) FROM xxx
  • @engineersmnky 我没有提到 AR,因为该指南被命名为“Ruby Style Guide”,而 Rubocop 的指南区分了 Ruby 和 Rails。我也不认为在这种情况下答案很简单,因为当计算 AR 关系时,分页和记录是否已经加载开始发挥作用,这使得很难写出关于什么更好的概括性陈述。
  • 我的意思不是你有没有提到它,而是该指南是由 Airbnb 编写的,第一行声明“这是 Airbnb 的 Ruby 风格指南”。这意味着它可能有一些倾向。看看它肯定会做的例子。 Airbnb 也没有做出这样的区分,而是包含了一个相当简短的 Rails 部分。
猜你喜欢
  • 2010-09-15
  • 2011-03-18
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 2015-06-29
  • 2022-01-03
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多