私は自分のアプリのパフォーマンスを改善したいと思い、http://guides.rubyonrails.org/performance_testing.htmlを読み始めました。私の質問は、この「どのように私が始まったか」の末尾にあります。レール3アプリケーションのパフォーマンスを改善する:ベストワークフロー?
だから私は、端末内
bundle exec rake test:profile
の出力は
BrowsingTest#test_homepage (909 ms warmup)
wall_time: 341 ms
process_time: 517 ms
とprocess_timeフラットファイルである、それはその
のように起動しclass BrowsingTest < ActionDispatch::PerformanceTest
self.profile_options = { :runs => 5, :metrics => [:wall_time, :process_time],
:output => 'tmp/performance', :formats => [:flat] }
def test_homepage
get '/'
end
end
でシンプル開始
Thread ID: 70299857145540
Total: 2.589931
%self total self wait child calls name
12.45 0.32 0.32 0.00 0.00 110 BasicObject#method_missing
10.59 0.28 0.27 0.00 0.01 415 Kernel#raise
7.79 0.20 0.20 0.00 0.00 1350 <Class::Dir>#[]
どうしたらいいのか分からず、私はmethod_missingをたくさん使うものを探すことから始めました。私は、メトリクスを変換するために使用しているライブラリ(Alchemist)がそれを行い、Numericクラスにそれ自体を含めることを発見しました。
ホームページには本当に必要ないので、私はlibを削除してプロファイリングテストを再実行しました。 私は、次の
BrowsingTest#test_homepage (856 ms warmup)
wall_time: 321 ms
process_time: 482 ms
を持って、フラット・ファイルはもう
Thread ID: 70185893711560
Total: 2.420023
%self total self wait child calls name
12.05 0.29 0.29 0.00 0.00 5 ActionView::Base#helpers
8.32 0.20 0.20 0.00 0.00 1350 <Class::Dir>#[]
5.12 0.12 0.12 0.00 0.00 5925 String#gsub
をmethod_missing持っていなかった私はそれをもう一度実行し、だからと思われ
BrowsingTest#test_homepage (856 ms warmup)
wall_time: 321 ms
process_time: 482 ms
Thread ID: 70231460630220
Total: 2.411142
%self total self wait child calls name
14.18 1.49 0.34 0.00 1.16 3265 Array#each
8.26 0.20 0.20 0.00 0.00 1350 <Class::Dir>#[]
4.94 0.12 0.12 0.00 0.00 205 Kernel#caller
を得た。この時ライブラリーを使用しないと〜35msの処理時間が節約されます。これは、フラットファイルの内容とかなり一致しているようです。私はそれについて何かしようとしなければならないと思う、特にそれはNumericの包含のためにとても頻繁に呼ばれるようである。
今ここに私の質問は以下のとおりです。それは正しいアプローチ
- ですか?そこから始める方がいいですか?
- パフォーマンスを低下させるクラス/メソッドを特定する最良の方法は何ですか(私の次のステップはDirを使用することですが、複数の場所が使用されています)
- 許容される処理時間はどのくらいですか?
- テストを実行しました:プロファイルを複数回連続して実行し、 "String#gsub"のセルフタイムが0.04から0.12になりました。何が起こるか?
ありがとう!