---
layout: old_post
title: Ruby on Railsのパフォーマンス向上に関する10のtips
permalink: /tatsuya/show/268-ruby-on-rails-10-tips
---
という記事があった、色々と面白かったので訳してみる。良いとこも悪いとこもあると思うけど参考までにメモとして
元記事:Top 10 Ruby on Rails performance tips
- Rubyの基本的なコードを見直してみる
- 自分で作ったクラスよりもできるだけ組み込みのクラスライブラリを使う
- できるだけ正規表現を使用する、文字列処理にコストの高いループは避ける
- REXMLは遅いのでLibxmlライブラリを使用する (Cで書かれたXMLパーサらしい、環境に依存するのは嫌かもしれない)
- if文の多用は避ける、例えば||=を使う ( z||="none" で unless(z){ z = "none" })
- Hashはコストが高いので他のデータ構造を検討してみる (でも使いたいときあるよね?)
- キャッシュを有効活用する
- acts_as_cached でModelをキャッシュ化してみる(PDF資料) (賛成。acts_as_cached楽しい)
- セッションの管理にはMemCacheStore(memcachedにSessionを入れるべきか?論争の元。ケースバイケースだと思う)
- ページのキャッシュを行なう、またextended_fragment_cache Pluginを試してみる(知らんかった<% cache("/x/y/z") do %><% end %>とやってブロックの単位でキャッシュできるのかな?)
- データベースへの直接アクセスを行う
- パフォーマンスが必要な部分ではActiveRecord経由ではなく、直接DBへアクセスを行なう。またストアドプロシージャ等DB特有機能の使用を検討する。Railsではデータがネックになる場合が多いので非常に有効 (でもできるだけやりたくないと思う・・・まあ必要になれば)
- findメソッドに注意する
- findメソッドはパワフルだけど基本SELECT * FROMなので場合によっては:selectで必要なカラムだけ読み込む、また:limitや:offsetを活用する
- MyModel.find_by_* みたいな記述は読みやすく書きやすいけどパフォーマンスは悪い。普通のfindの方が良い。さらにfind_by_sqlのが良い。(まあシビアな所でなければ良いと思う)
- ActiveRecordで複数の処理を行なうとき(複数件を繰り返し処理等)はtransactionで囲う。Quote.transaction do ....... endの様に(一括してSQL投げるのかな?あとで試す)
- Controllerについて、filterはコストが高いので多用しない、またインスタンス変数は必要な物にしぼる。
- View内でHTMLを積極的に使用する
- ヘルパーを使わず直にHTML書いた方が処理が軽い、デザイナーと共同作業する場合などRubyのコードよりHTMLが多い方が喜ばれる (個人的にはヘルパーを多用したほうが変更に強くなって良いと思うけど、ケースバイケースですな)
- Logのレベルを下げる
- Logger::DEBUG等はLog出力にパフォーマンスが持っていかれる。
- Rubyにガベージコレクションのパッチを当てる (リンクが間違っているきがする、まあ参考程度に)
- これらの最適化を無駄にやりすぎないでください (本当にパフォーマンスが必要になってから真剣に考える、でも良いと思う)
- Last minute changes and tweaks are possible but less desirable than a “performance aware” style of coding. Profile your applications, benchmark them and have fun experimenting.(railsbenchとruby-prof?力尽きた)