每个声明都需要花费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
完成后,我似乎在时间相关功能上花费了很多时间:
有没有办法可以避免做时间的事情?我相信created_at存储为一个整数,所以有没有办法获取数字并使用它而不是让rails转换它多次?