2017-06-12 11 views
3

これがRails固有の問題であるかどうかはわかりません。そのため、私はrubyとタグ付けしました。Rails 4:なぜパーシャルをレンダリングするのが速いのですか?

私は部分的にeventレコードのコレクションをレンダリングしています。しかし、部分的にレンダリングすると、パフォーマンスが大幅に異なることがわかりました。

どちらのバージョンもまったく同じデータを使用していますが、変更するのは部分データをレンダリングするコードだけです。

ひょっとして、1つのバージョンが他のバージョンより常に4倍速いのはなぜですか?私は、私が取っているものを他の性能ヒットを...思ってしまう

スローバージョン(950msの合計要求時間):

<% events.each do |event| %> 
    <%= render partial: "events/event", locals: { event: event } %> 
<% end %> 

# Log output 
Rendered events/_event.html.erb (1.1ms) 
Rendered events/_event.html.erb (1.1ms) 
... 

高速化バージョン(250msの合計要求時間):

<%= render partial: "events/event", collection: events, as: :event %> 

# Log output 
Rendered events/_event.html.erb (58.7ms) 
+0

部分的にレンダリングすると、htmlが最初にコンパイルされます。最初の場合は 'events.length'回、2回目は一回しか起こりません。この状況(ループが遅い)は、DBクエリなど、Railsの他の場所でも発生します。それは "N + 1"と呼ばれ、 –

答えて

3

例1: (イベントに応じて)部分的にx回レンダリングしています。 これは、html x回をコンパイルすることを意味します(ループが実行されるたびに1回)。これは遅いです

例2: イベントのコレクションを持つ部分的な部分をレンダリングしています htmlは(部分的に1つしかないので)一度コンパイルされます。これは高速です

関連する問題