哪个更快“计数”或“长度”?

时间:2013-02-10 03:45:56

标签: ruby-on-rails ruby-on-rails-3

假设有2个模型叫UserPost

“A计划”或“计划B”的性能(快速)会更好吗?

“计划A”

控制器

@users = User.find_all_by_country(params[:country])
@posts = Post.find_all_by_category(params[:category])

查看

<%= @users.count.to_s %>
<%= @posts.count.to_s %>

“B计划”

控制器

@users = User.find_all_by_country(params[:country])
@posts = Post.find_all_by_category(params[:category])

查看

<%= @users.length.to_s %>
<%= @posts.length.to_s %>

2 个答案:

答案 0 :(得分:13)

在ruby中,countlengthsize对数组做的几乎完全相同。有关详细信息,请参阅here

使用 ActiveRecord对象时,count优于lengthsize更好。

find_all_by_country返回一个哑数组,因此你不应该使用该方法(因为它总是返回一个数组)。相反,请使用where(country: params[:country])

我会让Code SchoolRails Best Practices幻灯片93为自己说话(希望他们不要因为我在这里复制它而生气)。

enter image description here

以防图像被删除,基本上是:

  1. length总是拉出所有记录,然后在数组上调用.length

  2. count总是进行计数查询 - 好

  3. 如果你有一个缓存计数器,
  4. size查看缓存,否则进行计数查询 - 最好

答案 1 :(得分:1)

两者都是相同的,count没有参数,length是相同的,因为你在Ruby数组上调用它们(由魔法find_*方法返回),而不是ActiveRecord对象。

也就是说,如果您只是对匹配记录的数量感兴趣,这两种方法都是最差方式。

不是实例化整个结果集只是为了找到它的长度,而是在实际的ActiveRecord关系上使用.count

@num_users = User.where(country: params[:country]).count
@num_posts = Post.where(category: params[:category]).count

这实际上会以select count(*) from而不是完整的select * from执行,根据结果的数量,这会更快。