ActiveRecord慢对象实例化

时间:2015-06-10 16:51:00

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

我在我的城市设有一个活动网站。

我的网站主页是一个为期5天的日历,所有活动从今天开始到将来的4天。

我的“ActiveRecord”代码做得相当不错,因为我在MySQL中花费了大约120毫秒(使用RackMiniProfiler进行了双重检查)以加载~200-300个事件。

但是我的响应时间非常慢(1.5s - 2s)。

大部分时间花在从查询中实例化AR的对象

使用ObjectSpace,我看到 ~6k AR :: Base对象被实例化,用于显示的+300个事件。

有这么多对象的原因是我的事件模型有许多关联模型(例如场地,事件,类别等等),所有这些都包含我需要的一些信息显示。

正如预期的那样,分析证明ActiveRecord的对象实例化是请求期间最耗费的任务。

我对ActiveRecord及其表现都没有足够的经验。

是期望这样的速度还是应该更快地实例化我的对象?

我应该离开AR并使用简单的ruby哈希吗?

当我的数据模型太复杂时,这是 Rails标准吗?

=========更新1 =========

pastebin包含我用于在日历中加载一天事件的服务类。 我希望这是可以理解的,我没有时间正确记录它,因为它仍然是一项正在进行中以提高性能的工作。

=========更新2 =========

加载所有这些对象还有另一个缺点:在呈现页面时导致 GC运行,在每次 n 事件呈现后添加~100ms,这将成为一个总数开销约500毫秒。

为了让您知道我正在加载多少数据(遗憾的是99%需要它),如果我转储到JSON我得到一个47K文件

=========更新3 =========

正如@TheSuper所提到的,即使它没有提高AR的性能,片段缓存确实是我的朋友,因为我在GC运行时渲染了大量的数据。应用片段缓存产生了1-1.2s的改善,这是巨大的。

然而,我仍然无法克服AR的600ms墙。 可能的改进是this answer中讨论的“selective includes”,对于我需要包含模型的一小部分属性的少数情况,但这是丑陋且不灵活的。

0 个答案:

没有答案