3rdRailによるRailsプログラミング入門

第10回 3rdRailでプロファイリングしよう

富田 陽介
Banana Systems株式会社

2009/12/11

プロファイル結果を使用したアプリケーションの改修

 さて、ボトルネックが見えてきましたので、次は解消方法について検討してみましょう。

 メソッド呼び出しフローを見ていく限りでは、このボトルネックは、ActionViewやActiveRecordが大量の件数のレコードを扱うのに、多すぎる回数のメソッドをコールしていることによるもののようです。

 一方で、1つ1つのメソッド実行時間はそれほど長くはなっていないことも読み取れます。

 つまり、1万件あるレコードを一覧画面で一度に表示するという要件が、ビュー生成時に大量のメソッド呼び出しを行う原因となっており、結果、全体の処理時間の増大を引き起こしていると考えられます。

 もちろん、この要件を満たしたまま、何とか処理時間を低減させるというアプローチもあるでしょう。しかし、今回はメソッド呼び出し回数を減らすような仕様変更でボトルネックの解消を試みていきたいと思います。

 1万件あるレコードを一度に表示しないようにするには、どのような仕様にするのが適切でしょうか。

 この課題に対するもっとも一般的な解決策は、一覧画面に表示するレコード件数に上限を設定し、一覧画面を適当に分割することです。このように一覧画面に実装する分割/ページ送りの機能のことをページネーションと呼びます。

 それでは、一覧画面にページネーション機能を追加し、一度に表示するレコード数を制限するように仕様を変更していきたいと思います。

Railsアプリケーションでの外部ライブラリの利用

 ページネーション機能は、Webアプリケーションの実装において、とくに必要とされる機能です。

 Railsアプリケーションでページネーション機能を実装する場合、非常に便利なライブラリとしてwill_paginateが挙げられます。will_paginateはmislav氏によって開発されているgemライブラリです。

 Railsアプリケーションで外部ライブラリを利用する方法には、gem形式のライブラリをインストールする方法と、プラグインと呼ばれる形式のものをインストールする方法とがあります。

 gemライブラリとしてインストールしておくと、Railsアプリケーションに限らず、Rubyでのプログラミングを行う際に、いつでも必要に応じて読み込んで利用できます。

 一方、プラグイン形式のインストールでは、ライブラリファイル一式がRailsアプリケーションのプロジェクトディレクトリ以下に保存されるため、ほかのプロジェクトから利用できません。

 どちらの方法でインストールするかは、アプリケーションサーバの運用方針やソースコードのバージョン管理方針、ライブラリの提供形態などによって決まります。

 will_paginateは、gemライブラリとして提供されているので、今回はgemライブラリを追加してプロジェクトで利用していく方法について紹介します。

will_paginateライブラリのインストール

 まず、プロジェクトでwill_paginateを使用するための設定を行います。

 [Rails]パースペクティブに戻り、[Railsエクスプローラー]−[tsubuyakiプロジェクト]から[構成]ツリーを展開し、environment.rbをダブルクリックします。

 environment.rbに記述されているRails::Initializer.run do |config|ブロックの中に以下のコードを追記します。

config.gem 'mislav-will_paginate', :version => '~> 2.3.11', :lib => 'will_paginate',
     :source => 'http://gems.github.com'
画面8 environment.rb(画像をクリックすると拡大します)
environment.rb

 これは、will_paginateをインストールする設定(ライブラリ名や使用バージョン、インストール先の指定)となります。それでは、このインストール設定を使用して、will_paginateのインストールを行いましょう。

 インストールには、プロジェクト・コマンダーを使用します。3rdRailメニューから[ウィンドウ]−[プロジェクト・コマンダー]−[最後または新規のコマンダーの表示]をクリックすると、画面下の[コンソール]タブにプロジェクト・コマンダーが表示されます。

 以下のコマンドを入力し、will_paginateのインストールを実行します。

>rake gems:install

 ここで画面9のような警告が表示されることもありますが、1 gem installedと表示されれば、ライブラリのインストールは完了です。

画面9 gemライブラリをインストール(画像をクリックすると拡大します)
gemライブラリをインストール

will_paginateライブラリの利用

 それでは、will_paginateの利用コードを実装していきます。will_paginateを利用すると、ページネーション機能実装は驚くほど簡単です。hitokotos_controller.rbと、これに関連するindexビューのテンプレートをそれぞれ1カ所、以下のように書き換えるだけで修正は完了します。

●hitokotos_controller.rb
class HitokotosController < ApplicationController
  # GET /hitokotos
  def index
    @hitokotos = Hitokoto.paginate(:page => params[:page])

    respond_to do |format|
      format.html # index.html.erb
    end
  end
:
●hitokotos/index.html.erb
:
    <td><%= link_to '削除!', hitokoto, :confirm => '本当に削除しますか?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<%= will_paginate @hitokotos %>

 HitokotosControllerでは、indexアクションの中で、ビューに渡す「ひとこと」のリスト@hitokotosを作成する際、これまでのHitokoto.find(:all)に代わってHitokoto.paginateというメソッドを使用するように書き換えました。

 will_paginateの利用により、このようなメソッドが利用できるようになっています。引数に渡しているのはページ番号のパラメータとなりますが、これはwill_paginateから利用されるパラメータですので、このまま記述してください。

 indexのビューには、最終行に<%= will_paginate @hitokotos %>という1行を追加しました。これは、ページネーションを行う際のページ番号やリンクを表示するためのヘルパーメソッドで、これもwill_paginateライブラリが提供している機能です。

 なお、HitokotosControllerで使用しているpaginateメソッドには、このほかにも、ファインダメソッドのような検索条件や、1ページあたりの表示件数(デフォルト30件)なども指定できるようになっています。

 また、ビューやModelクラスでも各種オプションが指定できるようになっています。指定できるオプションの詳細については、will_paginateのWebページを参照してください。

 以上で、will_paginateを利用するためのコードの実装は完了です。ここで、今回の修正がHitokotosControllerの機能テスト結果に影響を与えていないかを確認しておきましょう。

画面10 機能テスト結果(成功)
機能テスト結果(成功)

 テストは問題なく終了しました。それでは、実装したページネーションがどのように機能しているか、アプリケーションを[サーバーで実行]して、「ひとこと」一覧画面を確認してみましょう。

画面11 ページネーション動作確認
ページネーション動作確認

 画面11のように、「ひとこと」の下にページ番号やリンクが表示されていればOKです。

 では、最後に再度「ひとこと」一覧のプロファイリングを行ってみましょう。

画面12 改修後のプロファイリング結果(画像をクリックすると拡大します)
改修後のプロファイリング結果

 ページネーションにより一覧画面での読み込み件数を制限した結果、CPU利用時間が6186msになり、1万件を読み込んでいたときの2割弱にまで減少しました。なお、もっともCPU利用率の高い一番下のスレッドは、Railsアプリケーションサーバの起動処理でした。

 今回は、3rdRailが提供する組み込みプロファイラ機能を使用した、Railsアプリケーションのプロファイリングについて紹介してきました。また、発見したボトルネックを解消するためのサンプルとして、外部ライブラリであるwill_paginateを3rdRailの組み込みコンソールからインストールする手順や、このライブラリの利用方法を紹介しました。

 以上、10回に渡って「3rdRailによるRailsプログラミング入門」と題して、IDEを利用したRailsプログラミングについて紹介してきました。この連載は今回で終了しますが、本連載にご興味を持っていただいた方には、より高度で実践的なRailsプログラミングにチャレンジしていっていただきたいと思います。

 ここまでお読みいただき、ありがとうございました。

prev
2/2
 

Index
3rdRailでプロファイリングしよう
  Page1
アプリケーションのプロファイリングとは
プロファイリングの準備――ダミーデータの作成
3rdRailのプロファイリング機能
  Page2
プロファイル結果を使用したアプリケーションの改修
Railsアプリケーションでの外部ライブラリの利用
will_paginateライブラリのインストール
will_paginateライブラリの利用

index 3rdRailによるRailsプログラミング入門

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間