按照建议添加急切负载后,Rails 子弹宝石速度变慢

rig*_*gyt 3 ruby-on-rails eager-loading rails-bullet

我添加了项目符号 gem来建议我开发中的任何 N+1 查询(Rails 4.0.2),它建议急切地加载模型的两个父关联,在其中显示其所有记录。

在急切加载这些所属关联之一之前:

Completed 200 OK in 5252ms (Views: 1.8ms | ActiveRecord: 114.1ms)
Run Code Online (Sandbox Code Playgroud)

急切加载后:

Completed 200 OK in 6741ms (Views: 2.1ms | ActiveRecord: 146.0ms)
Run Code Online (Sandbox Code Playgroud)

此外,通过急切加载,浏览器会在控制台显示已完成后挂起,并且在一段时间内(大约 6 秒)不会更新。服务器生产没有这种冻结问题,但在这种情况下,急切加载仍然是一个糟糕的建议。

急切加载会变慢是否有意义?该视图确实访问(预先加载的)父记录。

此外,由于某种原因,子弹宝石不显示调用堆栈。

Ink*_*ing 5

此外,通过急切加载,浏览器会在控制台显示已完成后挂起,并且在一段时间内(大约 6 秒)不会更新。

正如我今天发现的,这可能是 Bullet 本身造成的。原因是它插入了一个中间件,该中间件必须在浏览器接收页面之前遍历并分析您的查询。因此,可以想象,查询中的任何变化都可能会影响 Bullet 执行任务的速度。

通过删除我的一个应用程序中的 Bullet,我消除了一个慢速页面上的额外延迟,并将实际报告的渲染时间减少了一整秒。

因此,当您进行比较时,请在禁用 Bullet 的情况下进行比较(在您的配置中或通过暂时从 Gemfile 中删除并运行bundle)。它仍然是一个有价值的工具,但显然对于某些应用程序来说,仅在您尝试优化事物时定期启用它可能是一个好主意。