Ruby on Rails でコントローラー アクションをプロファイリングする最良の方法は何ですか。puts Time.now
現在、私はボトルネックになると思われるものの間に呼び出しを投げ込むという力ずくの方法を使用しています。しかし、それは本当に、本当に汚いと感じます。もっと良い方法があるはずです。
5 に答える
しばらく前にこのテクニックを手に入れましたが、非常に便利であることがわかりました。
配置したら?profile=true
、コントローラーにヒットする任意の URL に追加できます。アクションは通常どおり実行されますが、レンダリングされたページをブラウザーに配信する代わりに、アクションが時間を費やした場所を示す詳細で適切にフォーマットされた ruby-prof ページが送信されます。
最初に、おそらく開発グループの Gemfile に ruby-prof を追加します。
group :development do
gem "ruby-prof"
end
次に、 Around フィルターを ApplicationController に追加します。
around_action :performance_profile if Rails.env == 'development'
def performance_profile
if params[:profile] && result = RubyProf.profile { yield }
out = StringIO.new
RubyProf::GraphHtmlPrinter.new(result).print out, :min_percent => 0
self.response_body = out.string
else
yield
end
end
ruby-prof の出力を読むのはちょっとした芸術ですが、それは演習として残しておきます。
ScottJShea による追加メモ: 測定タイプを変更する場合は、次のように指定します。
RubyProf.measure_mode = RubyProf::GC_TIME #example
if
アプリケーション コントローラーのプロファイル メソッドの前。ruby-prof ページで利用可能な測定値のリストを見つけることができます。これを書いている時点では、memory
およびallocations
データ ストリームが壊れているようです (欠陥 を参照)。
Benchmark 標準ライブラリと、Rails で利用可能なさまざまなテスト (ユニット、機能、統合) を使用します。次に例を示します。
def test_do_something
elapsed_time = Benchmark.realtime do
100.downto(1) do |index|
# do something here
end
end
assert elapsed_time < SOME_LIMIT
end
したがって、ここでは何かを 100 回実行し、Benchmark ライブラリを介して時間を計り、SOME_LIMIT 時間未満で完了したことを確認します。
Benchmark.realtime リファレンスとTest::Unit リファレンスのリンクも役立つ場合があります。また、「本を読む」ことに興味がある場合は、 Agile Web Development with Railsから例のアイデアを取り上げました。この例では、さまざまなテストの種類とパフォーマンス テストについて少し説明しています。
見る価値のあるプロファイリングに関するRailscastがあります
FiveRuns TuneUpサービスは非常に優れているため、試してみることをお勧めします。免責事項: 私は FiveRuns とはまったく関係がありません。このサービスを試してみたところです。
TuneUp は無料のサービスで、プラグインをダウンロードすると、アプリケーションを実行すると、画面の上部にパネルが挿入され、展開して詳細なパフォーマンス メトリックを表示できます。
モデル、ビュー、およびコントローラーで費やされた時間の割合を示すグラフなど、いくつかの優れたグラフが表示されます。必要に応じて、ActiveRecord が実行している個々の SQL クエリを表示するためにドリルダウンすることもできます。また、別のクリックで、基になるデータベース スキーマを表示することもできます。
最後に、オプションでプロファイリング データを FiveRuns サイトにアップロードして、コミュニティのパフォーマンス分析とアドバイスを得ることができます。
これはRails 4.2.6で動作します:
o=OpenStruct.new(logger: Rails.logger)
o.extend ActiveSupport::Benchmarkable
o.benchmark 'name' do
# ... your code ...
end