33

Ruby on Rails でコントローラー アクションをプロファイリングする最良の方法は何ですか。puts Time.now現在、私はボトルネックになると思われるものの間に呼び出しを投げ込むという力ずくの方法を使用しています。しかし、それは本当に、本当に汚いと感じます。もっと良い方法があるはずです。

4

5 に答える 5

44

しばらく前にこのテクニックを手に入れましたが、非常に便利であることがわかりました。

配置したら?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データ ストリームが壊れているようです (欠陥 を参照)。

于 2012-01-28T03:01:19.657 に答える
9

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から例のアイデアを取り上げました。この例では、さまざまなテストの種類とパフォーマンス テストについて少し説明しています。

于 2008-08-27T23:53:02.130 に答える
9

見る価値のあるプロファイリングに関するRailscastがあります

http://railscasts.com/episodes/98-request-profiling

于 2008-08-28T18:40:04.153 に答える
1

FiveRuns TuneUpサービスは非常に優れているため、試してみることをお勧めします。免責事項: 私は FiveRuns とはまったく関係がありません。このサービスを試してみたところです。

TuneUp は無料のサービスで、プラグインをダウンロードすると、アプリケーションを実行すると、画面の上部にパネルが挿入され、展開して詳細なパフォーマンス メトリックを表示できます。

モデル、ビュー、およびコントローラーで費やされた時間の割合を示すグラフなど、いくつかの優れたグラフが表示されます。必要に応じて、ActiveRecord が実行している個々の SQL クエリを表示するためにドリルダウンすることもできます。また、別のクリックで、基になるデータベース スキーマを表示することもできます。

最後に、オプションでプロファイリング データを FiveRuns サイトにアップロードして、コミュニティのパフォーマンス分析とアドバイスを得ることができます。

于 2008-08-28T18:52:37.307 に答える
-1

これはRails 4.2.6で動作します:

    o=OpenStruct.new(logger: Rails.logger)
    o.extend ActiveSupport::Benchmarkable
    o.benchmark 'name' do
      # ... your code ...
    end
于 2016-04-27T03:21:21.177 に答える