Ruby Academy · レッスン

プロファイリングツール

ruby-prof と stackprof です。

レッスン 2/413 ステップ

「プロファイリングツール」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

Benchmarkとプロファイラの違い

ベンチマークは、処理にどれだけ時間がかかるかを示します。プロファイラは、その処理の内部で時間がどこに費やされているかを示します。

  • プロファイラはメソッドや行ごとに時間を分解します
  • 予想もできなかったホットスポットを明らかにします
  • Rubyでよく使われるプロファイラにはruby-profとstackprofがあります
# Profilers answer: which method consumed the most time?
puts 'Benchmark = how long, Profiler = where'

ruby-profの概要

ruby-profは詳細な計測型プロファイラです。すべてのメソッド呼び出しをフックします。

  • 呼び出し回数と実行時間を非常に正確に計測できます
  • オーバーヘッドが大きいため、代表的なサンプルに対して使います
  • gem install ruby-profでインストールします
# Gemfile
gem 'ruby-prof'

ruby-profでブロックをプロファイリングする

コードをRubyProf.profileでラップすると、出力可能な結果を取得できます。

  • プロファイル結果オブジェクトを返します
  • プリンターに渡して出力します
require 'ruby-prof'

result = RubyProf.profile do
  1000.times { |i| (1..i).reduce(:+) }
end

RubyProf::FlatPrinter.new(result).print(STDOUT)

ruby-profのプリンター

ruby-profには、さまざまな表示方法に対応するプリンターが用意されています。

  • FlatPrinterはメソッドを並べ替えた一覧を出力します
  • GraphPrinterは呼び出し元と呼び出し先の関係を出力します
  • CallTreePrinterはKCachegrind用の出力を生成します
require 'ruby-prof'

result = RubyProf.profile { 100.times { 'x' * 1000 } }
RubyProf::GraphPrinter.new(result).print(STDOUT, min_percent: 1)

フラットプロファイルを読む

フラットプロファイルには、消費時間の多い順にメソッドが一覧表示されます。

  • %selfはメソッド自体で費やした時間です
  • totalは呼び出し先を含む合計時間です
  • callsは呼び出された回数です

まずは%selfが最も高い項目に注目してください。

# Example flat output columns:
# %self  total  self  wait  child  calls  name
puts 'Optimize the top %self method first'

stackprofの概要

stackprofはサンプリング型プロファイラです。定期的にコールスタックを記録します。

  • オーバーヘッドが非常に小さく、本番環境でも安全に使えます
  • CPU、実時間、オブジェクト割り当てを基準にサンプリングできます
  • gem install stackprofでインストールします
# Gemfile
gem 'stackprof'

stackprofを実行する

StackProf.runはブロックをプロファイリングし、結果をファイルに書き込みます。

  • mode:には:cpu、:wall、:objectを指定できます
  • out:でダンプファイルのパスを設定します
require 'stackprof'

StackProf.run(mode: :cpu, out: 'profile.dump') do
  1_000_000.times { |i| Math.sqrt(i) }
end

stackprofの結果を調べる

stackprofコマンドラインツールを使ってダンプを読み取ります。

  • stackprof profile.dump --textで概要を表示します
  • --method Name#methで1つのメソッドを詳しく調べます
  • --flamegraphでフレームグラフ用データを生成します
# Shell
# stackprof profile.dump --text
# stackprof profile.dump --method 'Array#sort'
puts 'Analyze the dump with the stackprof CLI'

サンプリングと計測

2つのプロファイラは、正確さとオーバーヘッドのバランスが異なります。

  • ruby-profはすべての呼び出しを計測します。正確ですが低速です
  • stackprofはサンプリングします。近似値ですが低コストです
  • 本番環境ではstackprofを、詳細な調査にはruby-profを使います
modes = { 'ruby-prof' => 'instrumenting', 'stackprof' => 'sampling' }
modes.each { |tool, kind| puts "#{tool}: #{kind}" }

実時間とCPU時間

ボトルネックに応じてプロファイリングモードを選びます。

  • CPUモードでは計算負荷の高いコードがわかります
  • WallモードではネットワークやディスクなどのI/O待ち時間も計測できます
  • DB呼び出しを含む遅いエンドポイントにはWallモードが必要です
# I/O bound? use wall. CPU bound? use cpu.
bottleneck = 'database query'
mode = bottleneck.include?('query') ? :wall : :cpu
puts "Use mode: #{mode}"

プロファイリングのワークフロー

効果的なプロファイリングは、次のループに沿って行います。

  • 遅い状況を再現します
  • プロファイリングしてホットスポットを見つけます
  • そのホットスポットだけを最適化します
  • 再度プロファイリングして改善を確認します
steps = ['reproduce', 'profile', 'optimize hotspot', 're-profile']
steps.each_with_index { |s, i| puts "#{i + 1}. #{s}" }

理解度チェック

プロファイリングについての知識を確認しましょう。

まとめ

プロファイリングツールについて学びました。

  • プロファイラは、単に時間の長さだけでなく、時間がどこで使われているかを示します
  • ruby-profはすべての呼び出しを計測し、詳細な情報を正確に取得します
  • stackprofは低コストでサンプリングするため、本番環境でも安全に使えます
  • ボトルネックに応じてCPUモードとWallモードを選びます
  • 再現、プロファイリング、最適化、再プロファイリングのループに従います

次はメモリ割り当てを減らします。

無料で開始

AI チューターと学ぶ Ruby — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
29
レッスン
109

よくある質問

「プロファイリングツール」レッスンは無料ですか?

はい。「プロファイリングツール」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「プロファイリングツール」で何を学びますか?

ruby-prof と stackprof です。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「プロファイリングツール」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パフォーマンスの測定
  2. プロファイリングツール
  3. メモリ最適化
  4. よくあるボトルネック
← Ruby Academyに戻る