前回、【Ruby】rblineprofで行単位の計測を行う方法でrblineprofを利用したRubyのプロファイリング方法について紹介しました。
rblineprofを利用すると、計測対象のファイルに計測用のコードを埋め込むことで行単位のプロファイリング結果がコンソールで確認できます。
rblineprof
と似たgemでpeek-rblineprofというものがあります。
peek-rblineprof
を利用すると、rblineprof
の計測結果が画面上で確認できます。
またpeek-rblineprof
はrblineprof
と違い、計測用のコードを埋め込む必要がありません。
今回はpeek-rblineprof
を利用したRailsアプリケーションの計測方法について紹介します。
railsは6.0.3.6
を利用します。
目次
下準備: サンプルアプリケーションの作成
今回は例として、N+1問題が発生しているビューの計測をします。
具体的には『生徒一覧画面で生徒名と所属学部を表示する』という画面でN+1問題を発生させます。
rails s
でアプリケーションの起動ができている前提で説明をします。
scaffoldでアプリのひな型を作成
scaffold
でStudentモデル(生徒)とDepartmentモデル(学部)に関するコードを一括作成します。
### scaffoldで関連コードを一括作成
$ rails g scaffold department name
$ rails g scaffold student name department:references
### マイグレーションの実行
$ rails db:migrate
N+1問題が発生する画面の作成
生徒一覧画面を作成します。
student.department.name
がN+1問題の発生する箇所です。
app/views/students/index.html.erb
<h1>生徒一覧</h1>
<table>
<thead>
<tr>
<th>生徒名</th>
<th>学部</th>
</tr>
</thead>
<tbody>
<% @students.each do |student| %>
<tr>
<td><%= student.name %></td>
<td><%= student.department.name %></td>
</tr>
<% end %>
</tbody>
</table>
サンプルデータの作成
seed
コマンドを利用してサンプルデータを作成します。
db/seeds.rb
Department.create(name:'経済学部')
Department.create(name:'外国語学部')
Department.create(name:'社会学部')
Department.create(name:'理工学部')
Student.create(name:'鈴木', department_id:1)
Student.create(name:'田中', department_id:2)
Student.create(name:'山田', department_id:3)
Student.create(name:'伊藤', department_id:4)
### seedデータをテーブルにインサート
$ rails db:seed
### seedデータのインサートをやり直したい場合
$ rails db:migrate:reset
$ rails db:seed
画面の確認
localhost:3000/students
にアクセスして以下のような生徒一覧の画面が表示されればOKです。

peek-rblineprofの導入手順
ここからはpeek-rblineprof
の導入手順について紹介します。
peek-rblineprofのインストール
Gemfileを修正し、peek-rblineprof
をインストールします。
Gemfile
group :development do
gem 'peek-rblineprof'
end
$ bundle
イニシャライザを追加する
イニシャライザに関するファイルを作成します。
config/initializers/peek.rb
Peek.into Peek::Views::Rblineprof
JSファイルとCSSファイルを修正する
peek-rblineprof
は計測結果を画面上に表示します。
そのためJSファイルとCSSファイルの修正が必要です。
以下のように修正します。
app/javascript/packs/application.js
require ("peek")
require ("peek/views/rblienprof")
assets/stylesheets/application.css
/*
*= require peek
*= require peek/views/rblineprof
*/
シンタックスハイライトを有効にする(任意)
peek-rblineprof
はデフォルトではコードのシンタックスハイライトが有効になっていません。
シンタックスハイライトを有効にする場合は以下の追加修正をします。
Gemfile
group :development do
gem 'peek-rblineprof'
+ gem 'pygments.rb', require: false
end
assets/stylesheets/application.css
/*
*= require peek
*= require peek/views/rblineprof
+ *= require peek/views/rblineprof/pygments
*/
peek-rblineprofで計測する方法
エンドポイントに?lineprof=[計測の範囲]&lineprofiler_mode=[モード]
というクエリパラメータを追加してアクセスをすると計測結果が確認できます。
各クエリパラメータのオプションは以下の通りです。
- app: 『Rails.root/(app|lib)』配下のコード
- views: 『Rails.root/app/views』配下のコード
- gems: 『Rails.root/vendor/gems』配下のコード
- all: 『Rails.root』配下のコード
- stdlib
- wall: 経過時間
- cpu: CPU時間 + アイドル時間(経過時間 – CPU時間)
たとえば、生徒の一覧画面(http://localhost:3000/students
)に関するビューのCPU時間を計測する場合はhttp://localhost:3000/students?lineprofiler=views&lineprofiler_mode=cpu
となります。
http://localhost:3000/students?lineprofiler=views&lineprofiler_mode=cpu
にアクセスした結果は以下の通りです。

シンタックスハイライトを有効にした場合の結果は以下の通りです。

まとめ
- gemをインストール
- peek-rblineprofのイニシャライザを設定
- CSSファイルとJSファイルを修正
- (必要であれば)シンタックスハイライトの設定
- 『?lineprof=[計測の範囲]&lineprofiler_mode=[モード]』のクエリパラメータを追加してアクセス
RailsをはじめとしたRackアプリケーションであれば、rack-lineprof
を利用した計測もオススメです。
rack-lineprof
はpeek-rblineprof
に比べて導入がシンプルで、処理の遅い行はハイライトされます。
rack-lineprof
を利用した計測手順についてはrack-lineprofを使ってRailsアプリを行単位でプロファイリングする手順で紹介していますのであわせてご覧になってください。
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!