LoginSignup
26
25

More than 5 years have passed since last update.

Railsでlayouts/applicationのレンダリングに30秒以上時間がかかったときの体験談

Last updated at Posted at 2013-10-07

Rails 3.2.13での出来事。

開発環境(Mac OS X 10.7.5 Lion)でだけ、Railsでlayouts/applicationのレンダリングに異常に時間がかかった。

storyblog.jpg

rack-mini-profilerで計測したらこうなった。Rendering: layouts/applicationに34秒。起動時だけでなく、ページ遷移ごとに異常に時間がかかる。

結局、原因はCSSとJSのコンパイルだった。app/views/layouts/application.html.erbの、

application.html.erb
  <%= stylesheet_link_tag    "application", :media => "all" %>
  <%= javascript_include_tag "application" %>

の部分を消して再アクセスすると0.193秒で処理が完了した。

開発環境では1リクエストごとに動的にコンパイルしている。これが異常な待ち時間の原因だった。

config/environments/development.rbでの設定で

config/environments/development.rb
config.assets.compress = false
config.assets.debug = true

としている(初期設定)のでこうなった。しかし設定をここから変えると、コンパイル前のassetsを更新してもlocalhostがそれを読み込まなくなったりする。できれば初期設定のままでいたい。ぐぬぬ。

Rails4はprecompileが速いらしいので、これからアプリケーションをRails4にアップデートして時間がどうなるか確かめてみるつもりだ。

追記

config/environments/development.rb
config.assets.compress = true
config.assets.debug = false

にして再起動したらまともなレンダリング時間になった。

storyblog_2.jpg

どういうことかというと、

config/environments/development.rb
config.assets.compress = true

でassets(jsとcss)をそれぞれ1つのファイルにして、renderされるhtmlは

<link href="/assets/application.css" media="all" rel="stylesheet" type="text/css">
<script src="/assets/application.js" type="text/javascript"></script>

になる。

config/environments/development.rb
config.assets.debug = false

にすることで、最初のリクエスト時にassets(cssとjs)をキャッシュして、それ以後はキャッシュしたjsとcssを使うようにする。assetsがキャッシュされているとき、手元でassetsを編集しても、ブラウザでlocalhostにリクエストを送ったとき、それに反応して更新されない。なのでassetsを編集するときはキャッシュを消す必要がある。と思う。

Asset Pipelineのドキュメントを日本語訳してくれた人がいたので、それを参考にして理解した。日本語訳: http://it.sifr.me/ruby-on-rails-asset-pipeline/

26
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
25