プロファイリングツール
ruby-prof と stackprof です。
「プロファイリングツール」は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) }
endstackprofの結果を調べる
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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- パフォーマンスの測定
- プロファイリングツール
- メモリ最適化
- よくあるボトルネック