🏃

【Rails7】パフォーマンス測定ヘルパー「benchmark」で、特定の処理の速度を測ってみる

2024/12/19に公開

はじめに

Railsを学ぶ中で、処理速度の測定に興味を持ちました。
調べていくと、Railsで使用することのできる「benchmarkヘルパー」を見つけたため、実際に試してみました。
https://railsguides.jp/action_view_helpers.html#パフォーマンス測定ヘルパー

試した手順

①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 testspeed 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)

まとめ

今回はヘルパーを使用して個々の処理速度を測定しましたが、モジュールを用いると複数の処理の速度を比較することができるので、こちらも試してみたいと感じました。
https://docs.ruby-lang.org/ja/latest/method/Benchmark/m/bm.html

参考記事

Railsガイド パフォーマンス測定ヘルパー
Ruby 3.3 リファレンスマニュアル Benchmarkモジュール
Rails・Rubyで benchmark を使って簡単にパフォーマンス計測をしてみよう!

Discussion