rails .each循环中的性能

时间:2016-06-15 18:11:33

标签: ruby-on-rails each

每个声明都需要花费1秒多的时间才能获得大约20000个元素,但乍一看它似乎不需要那么久。时间必须来自ping和holder的字段查找。除了将holder.created_at拉出来减少查找之外,我还能做些什么来加快查找速度吗?

这个代码块从数据库中给出了在最后X时间创建的所有元素的列表,在这种情况下,我希望大约每6分钟获得一个数据点。

我确实需要检查每个数据点,因为我最终会在每个块中做一些需要查看每个数据点的工作,所以我不能从数据库中提取更少的信息。

temp = @modem.pings.where('created_at >= ?', 30.days.ago)
holder = Temp.first
@pings = Array.new

temp.each do |ping|
  if (ping.created_at - holder.created_at >= 21600)
    @pings << ping
    holder = ping
  end
end

编辑:我已经从循环中删除了holder.created_at调用,这应该会使查找次数减少一半,但响应时间没有减少。我在找错了地方吗? temp.each do |ping|行的成本是否高,运行20000次需要一段时间?

Edit2:了解代码分析。实际的sql语句似乎不需要很长时间。如果我运行命令并且不对返回的数据执行任何操作,则速度非常快。但如果我对它返回的数据做了一些事情,那么我花费大约1/3的时间在ActiveRecord::AssociationRelation#exec_queries。在exec_queries完成后,我似乎在时间相关功能上花费了很多时间:

Stack trace during time functions

有没有办法可以避免做时间的事情?我相信created_at存储为一个整数,所以有没有办法获取数字并使用它而不是让rails转换它多次?

0 个答案:

没有答案