Rails 3.2.13での出来事。
開発環境(Mac OS X 10.7.5 Lion)でだけ、Railsでlayouts/applicationのレンダリングに異常に時間がかかった。
rack-mini-profilerで計測したらこうなった。Rendering: layouts/applicationに34秒。起動時だけでなく、ページ遷移ごとに異常に時間がかかる。
結局、原因はCSSとJSのコンパイルだった。app/views/layouts/application.html.erbの、
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
の部分を消して再アクセスすると0.193秒で処理が完了した。
開発環境では1リクエストごとに動的にコンパイルしている。これが異常な待ち時間の原因だった。
config/environments/development.rbでの設定で
config.assets.compress = false
config.assets.debug = true
としている(初期設定)のでこうなった。しかし設定をここから変えると、コンパイル前のassetsを更新してもlocalhostがそれを読み込まなくなったりする。できれば初期設定のままでいたい。ぐぬぬ。
Rails4はprecompileが速いらしいので、これからアプリケーションをRails4にアップデートして時間がどうなるか確かめてみるつもりだ。
追記
config.assets.compress = true
config.assets.debug = false
にして再起動したらまともなレンダリング時間になった。
どういうことかというと、
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.assets.debug = false
にすることで、最初のリクエスト時にassets(cssとjs)をキャッシュして、それ以後はキャッシュしたjsとcssを使うようにする。assetsがキャッシュされているとき、手元でassetsを編集しても、ブラウザでlocalhostにリクエストを送ったとき、それに反応して更新されない。なのでassetsを編集するときはキャッシュを消す必要がある。と思う。
Asset Pipelineのドキュメントを日本語訳してくれた人がいたので、それを参考にして理解した。日本語訳: http://it.sifr.me/ruby-on-rails-asset-pipeline/