Rails开发模式使视图极慢

时间:2013-05-07 14:20:56

标签: ruby-on-rails performance

除了render 'mypage'之外,控制器中除之外没有发生了什么,除了HTML之外,在视图中发生 nothing (我已经注释掉了所有的Ruby代码)地方),加载页面仍需要5秒钟:

Completed 200 OK in 6258ms (Views: 5283.2ms | ActiveRecord: 14.6ms)

有关如何改进或简介的任何建议?我遇到的每一个“解决方案”对我都没有影响。 Rails-dev-tweaks没有产生影响,更改资产调试标志没有效果;我实际上相信这一切都是在资产被请求之前发生的

更新 07年5月7日

大家好 - 感谢回复。让我先说我缩小到资产范围;删除大约六打宝石和所有资产使第一次加载的页面加载时间降至1.3s,重新加载约150ms。太棒了。所以我的问题现在变成了如何正确配置像rails-dev-tweak这样的gem来实现它;我似乎无法找到合适的配置。我们可能有一百左右的资产 - 可能还要多一点。

回答你的问题: 遗憾的是我无法复制和粘贴视图;但是,足以说它是大约100行HTML,10行javascript,也许30行HTML行中有一些Ruby代码,但我注释掉了所有的Ruby。

我试过ruby-prof - 没有给我任何有用的东西

没有外部HTTP请求

ApplicationController中有一个before_filter,但即使发表评论也没有太大的区别。

我正在使用Mac OS X 10.8进行开发

我正在使用Rails 3.2.13

完全没有资产: 第一页加载:

Completed 200 OK in 3418ms (Views: 1414.9ms | ActiveRecord: 74.6ms)

刷新页面:

Completed 200 OK in 140ms (Views: 120.8ms | ActiveRecord: 2.8ms)

有趣的是,rails -v需要4秒才能加载:

ruby-1.9.3-p327@aidin ± time rails -v
    Rails 3.2.13
    rails -v  4.10s user 0.24s system 92% cpu 4.679 total

更新2 07年5月7日

New Relic告诉我,我认为Rails依赖(实际上是一个ActionPack依赖)依赖于大量的时间,Journey本身:

                  Metric    Timestamp (s)   Duration (ms)   Exclusive (ms)
DashboardController#show    0.001           2,652           1917

详细信息页面显示了此文件:

journey-1.0.4/lib/journey/router.rb

这一行:

        status, headers, body = route.app.call(env)

更新3 5月07日@ 1509

进一步调查显示,除了删除所有资产外,删除所有宝石会将响应时间缩短到可接受的~150ms。将宝石放回去将其移动到800毫秒到1500毫米;很明显,那些单独出现问题的事情正在发生。

如果有人认为他们可以找出导致问题的宝石,我很乐意发布Gemfile

3 个答案:

答案 0 :(得分:3)

尝试使用本地IP地址访问您的应用程序

127.0.0.1:3000

在我的情况下,我的充电时间增加了2~3秒

答案 1 :(得分:0)

因此,加载时间通常是资产加载或SQL请求发生的结果。

首先,让我们从资产开始

rails应用程序经常出现的一个错误是开发人员正在加载方式更多的资产,而不是真正需要的资产。您可以执行的一些故障排除是在 application.js application.css 中,删除//= require_tree .。这会加载您在assets / stylesheets和assets / javascripts下的所有资产。

其次,减少SQL查询

您可能在控制器(!),模型或有时视图中运行了许多SQL查询。这些会大大减慢页面的加载时间,因为它们会不断反弹到您的数据库以完成查询。

另一个提示:

您可以将use Rack::Deflater添加到/config.ru以在页面加载时执行压缩等gzip。这有助于我加快我的网页速度。

最后提示:

尽量减少您在应用中使用的宝石数量。其中许多可能会节省一些时间,但每个都需要更多的HTTP请求来加载他们的资产。对于大多数人来说,您可以使用自己的代码复制他们的功能。

好的......还有一个

尽量减少生产资产。这减少了浏览器扫描代码的时间,因为它通过删除空格来减少行数!

希望这些帮助!

答案 2 :(得分:0)

这个问题可能已经很长时间了,但这很可能是/ etc / hosts问题。网址栏中的127.0.0.1通常有效,但我注意到这种情况并非如此。

在弄乱您的设置之前,请断开网络连接并查看是否有帮助。如果是,您很可能需要编辑/ etc / hosts。确保它有以下行。

127.0.0.1        localhost