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


16

Rails 3.1.0アプリケーションのパフォーマンスに問題があり、ARでクエリのドームを変更したため、ビューのレンダリングに時間がかかりすぎ、ビュー、ループなどを分割した多くのパーシャルでビュー内および他のパーシャル内で動的にレンダリングされます。

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

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

ありがとう

回答:


5

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

明らかに、特定のビューのレンダリングボリュームを効果的に削減するなど、特定のビューの一部のみをレンダリングし、他のケースを他のケースでレンダリングすると、速度が向上する場合があります。

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

更新:

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

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

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

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

コードの読みやすさは、ソフトウェアコードベースでできる最も重要なことです。


したがって、基本的に、パーシャルが本当に必要ない場合、そのコードが他のコントローラーによって再利用されない場合、動的にリロードされる場合、パーシャルを使用すべきではありませんか?これにより、ビューのレンダリング時間が改善されますか?
Mr_Nizzle

@Mr_Nizzle:あなたのコメントで生じた問題をカバーするために回答を更新しました。この費やされた説明がもっと理解できることを願っています...答えの私の2番目の段落が誤解される可能性があることに気付きました。
パトコスチャバ

おかげで男Code readability、それはすべてのことです。
Mr_Nizzle

22

私は両方の答えに同意しません。パーシャルからコードをコピーして、親ビューのパーシャルに存在する位置に貼り付けましたが、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をunDRYし、〜2000msに下げました。その時点で_modelパーシャルをインデックスに移動しようとしましたが、これはレンダリング時間に影響を与えなかったため、それをします。


ネストされたパーシャルに関する興味深い発見。1つの部分乾燥を解除すると600ミリ秒短縮され、すべての部分乾燥を解除すると3800ミリ秒短縮されましたか?そのためのデモアプリをリリースしてもらえますか?
ルラララ

@lulalalaはい、正確に言えば、申し訳ありませんが、私は自分の仕事のためにできなかったので、RailsからDjangoに移動しました。Wyatt Barnettの回答を見る、実際には、パーシャルが非効率的なDBアクセスを行っているのかどうかもわかりません。
AJP

1
私は同じことを見つけました。パーシャルからコードを取り出して、ビューをDRYすることで、パフォーマンスが約450ミリ秒向上しました。
bcackerman 14年

1
RailsをHAMLビューで使用した私の経験では、多くの小さなパーシャルはレンダリングを著しく遅くします。すべてのパーシャルに固定オーバーヘッドがあり、ビューで多くのパーシャルをレンダリングするときにガベージコレクションが開始されるようです。50項目のテーブルで使用されるパーシャルをインライン化すると、ページのレンダリングが500ミリ秒短縮されました。
d4n3 14

2
Rails 4:大きなアプリで数千個のネストされたパーシャルを削除しただけで、大幅に高速化されました。数字はありませんが、パフォーマンスの問題がある場合は、ネストされたパーシャルを削除して、それが役立つかどうかを確認する価値があります。
リック・スミス

5

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


2

現在、Rails 4.2アプリで作業しており、平均で約745ミリ秒かかっていた遅いアクションです。

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

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


2

n + 1に問題なく、すべてのデータベースを事前に処理する場合(再帰CTEなど)でも、ネストされたパーシャルは非常に低速です。HamlとErbはどちらも私には遅いようです。Rails 5.1.4では、各パーシャルに数ミリ秒が表示されますが、さらに悪化することがあります(おそらくガベージコレクションに対応)。

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


0

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


おそらく、開発バージョンがかなり遅い理由についてコメントしたり、どのテストでどのモードをいつ使用するかについて微妙な意見を述べることができます。
Kain0_0

率直に言って、私はすべての詳細を知りません、私はちょうど同じ問題を抱えていたことを知っています、そして、私が生産に切り替えたとき、それが大いに改善されたとわかりました。Paul Jungwirthが気づいたように、ファイルが変更された可能性のある開発中に、部分的および再解析の再読み取りが行われると推測できます。
ザパフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.