【Rails7】パフォーマンス測定ヘルパー「benchmark」で、特定の処理の速度を測ってみる
はじめに
Railsを学ぶ中で、処理速度の測定に興味を持ちました。
調べていくと、Railsで使用することのできる「benchmarkヘルパー」を見つけたため、実際に試してみました。
試した手順
①Fakerを用いてdbにデータを入れる
ある程度の量のデータがあった方が速度の比較がしやすいと思い、事前にFakerを用いてdbにデータの初期値を入れました。
#db/seeds.rb
User.create!(
name: "kamekame",
email: "example-1@practice.com",
password: "password",
password_confirmation: "password"
)
700.times do |n|
Post.create!(
title: Faker::Music.band,
content: "example-#{n+1}",
user_id: 1
)
end
②benchmarkヘルパーをcontrollerに埋め込む
今回は、
①posts#indexにアクセスし、@posts = current_user.posts.order(created_at: :desc)
の処理を終えるまでにかかる時間
②posts#showにアクセスし、@post = current_user.posts.find(params[:id])
の処理を終えるまでにかかる時間
上記の2つを測定してみます。
ログを見た際に区別できるよう、それぞれspeed test
、speed test2
という名前をつけます。
# app/controllers/PostsController.rb
class PostsController < ApplicationController
def index
benchmark("speed test") do
@posts = current_user.posts.order(created_at: :desc)
end
end
def show
benchmark("speed test2") do
@post = current_user.posts.find(params[:id])
end
end
end
③ログから処理速度を見る
下記録がログの内容です。
①posts#indexにアクセスし、@posts = current_user.posts.order(created_at: :desc)
の処理を終えるまでにかかる時間(「speed test」の部分)
→8.9ms
②posts#showにアクセスし、@post = current_user.posts.find(params[:id])
の処理を終えるまでにかかる時間(「speed test2」の部分)
→6.1ms
上記であることが読み取れました。
speed test (8.9ms)
Rendering layout layouts/application.html.erb
・・・省略・・・
Completed 200 OK in 2224ms (Views: 1927.6ms | ActiveRecord: 234.3ms | Allocations: 684781)
speed test2 (6.1ms)
Rendering layout layouts/application.html.erb
・・・省略・・・
Completed 200 OK in 113ms (Views: 37.9ms | ActiveRecord: 8.1ms | Allocations: 18882)
まとめ
今回はヘルパーを使用して個々の処理速度を測定しましたが、モジュールを用いると複数の処理の速度を比較することができるので、こちらも試してみたいと感じました。
参考記事
Railsガイド パフォーマンス測定ヘルパー
Ruby 3.3 リファレンスマニュアル Benchmarkモジュール
Rails・Rubyで benchmark を使って簡単にパフォーマンス計測をしてみよう!
Discussion