web-dev-qa-db-ja.com

Rails-パーシャルを使用するとビューのレンダリングが遅くなりますか?

Rails 3.1.0アプリケーション、ARを使用してクエリでドームの変更を行ったので、ビューのレンダリングに時間がかかりすぎる、ビュー、ループなどを分割しました。ビューの内部と内部で動的にレンダリングされる多くのパーシャルで他の部分音。

それで、多数のパーシャルを持つことは悪い習慣ですか?

ビューのレンダリング時間を改善するには、パーシャルの数を減らす必要がありますか?

ありがとう

16
Mr_Nizzle

同じコンテンツをレンダリングするとき、多くのパーシャルと1つの単一のビューの間でレンダリングパフォーマンスに大きな違いがないことを知っています。

明らかに、一部のパーシャルのみをレンダリングする場合と他の場合に他のパーシャルをレンダリングする場合、特定のビューのレンダリングボリュームを効果的に減らすと、速度が向上する可能性があります。

一方、私は常に、少なくとも2つの異なる場所から使用されるパーシャル抽象化を考慮して、それらの存在を正当化しました。パーシャルを使用するもう1つの理由は、同じビューをレンダリングしたいが、あるビジネスロジックに基づいて異なるパーシャルをロードする場合です。

更新:

レンダリング速度に関する測定値や具体的な数値を提供できません。ビューでパーシャルを使用する場合、それをレンダリングするにはrenderメソッドを呼び出すため、2番目のメソッド呼び出しがあります。これは、私の回答で述べたように、ほとんど何でもありませんが、物事を少し高速化するのに役立つ場合があります。

しかし、パーシャルを削除することでパフォーマンスの問題を修正するプロジェクトについて聞いたことがありません。パーシャルはビューに再利用メカニズムを提供する良い方法であり、プログラマーのビューからそれらはそのスコープに使用されるべきです。それらは、ビューの共通概念の抽象化である必要があります。

パーシャルが過度に使われるプロジェクトに取り組みました。 Railsではなく、同じMVC原則。想像できるすべてのものに小さなパーシャルを使用すると、何十ものパーシャルを持ち始めたときにそれらを見つけるのが難しくなります。変更する入力をどこで探しますか?ビューで?部分的に?このビューには4つのパーシャルがありますか? ...

いくつかのハードリファクタリングの後、ビューを更新するたびに、不要なパーシャルを削除しました。それらは完全には消えませんでしたが、残ったものはプロジェクトのために明確に定義された抽象化です。これらは、フォームなどでいくつかのビューで繰り返される、よく理解された要素(ある種のオブジェクトのツリーや特定のリストタイプなど)を表します。私はそのための部分がある木を見るかどうか知っています。特定のタイプのリストを見ると、その一部が存在することがわかります。私は彼らを追い詰める必要はありません。

コードの可読性は、ソフトウェアコードベースに対して実行できる最も重要なことです。

5
Patkos Csaba

私は両方の答えに同意しません。コードをパーシャルから親ビューのパーシャルに存在する位置にコピーして貼り付けましたが、500回の反復で、ビューのレンダリングにかかる​​時間が600ミリ秒もかかります。 <%= render xyz%>は私の意見では非常に壊れています。

例、ビューをレンダリングする合計時間:

Before:
5759.8ms
5804.2ms
5973.6ms

After:
5268.7ms
5201.6ms
5222.4ms

Diff = 5846 - 5231 = 615 ms

編集済み

_modelパーシャル内のすべての_partialsの乾燥を解除して、約2000ミリ秒まで下げました。その時点で、_modelパーシャルをインデックスに移動しようとしましたが、これはレンダリング時間に影響を与えなかったため、ネストされたレンダーへの呼び出しがあると思いますそれを行います。

22
AJP

Rails男ではありませんが、パーシャルビュー自体は問題ではない可能性があります。むしろ、SELECT N + 1を少し実行しているようです。DBサーバーの観点から物事を見て、あなたがそれをパルプに打ち負かしていないことを確認してください。

5
Wyatt Barnett

n + 1の問題はありませんがあり、すべてのデータベースを前もって(たとえば、再帰的なCTEで)実行しても、ネストされたパーシャルは非常に遅くなります。 HamlとErbはどちらも遅いように見えます。オンRails 5.1.4パーシャルごとに数ミリ秒が表示されます。さらに、ガベージコレクションに対応している)パーシャルパーシャルがはるかに悪い場合があります。

これらのリクエストのいずれかが実行されているときにパーシャルの名前を変更すると、ファイルが見つからないというエラーがすぐに表示されることに気付きました。したがって、Railsはディスクからパーシャルを読み取り、それを再解析し、反復ごとに評価しています。遅いのも不思議ではありません!

2

Rails 4.2アプリの開発中。スローアクションが平均で約745msかかっていました。

コードをパーシャルから削除してメインテンプレートに配置すると、平均時間が25ms未満になりました。

パーシャルをレンダリングするための呼び出しの数はわずか29でした。

2
Sammy Larbi

ネストされたパーシャルで見られる多くの遅延は、開発中にのみ発生します。テストするには本番環境に切り替えてください。

0
Zapaf