Rails - Verlangsamt die Verwendung von Teilansichten das Rendern?

16

Ich habe Leistungsprobleme bei einer Rails- 3.1.0Anwendung. Jetzt habe ich meine Abfragen mit AR geändert. Das Rendern von Ansichten nimmt jedoch immer noch zu viel Zeit in Anspruch. Ich habe die Ansichten, Schleifen und so weiter auf viele Teilbereiche aufgeteilt werden dynamisch in Ansichten und in anderen Teilbereichen gerendert.

Es ist also eine schlechte Praxis, eine große Anzahl von Partials zu haben?

Sollte ich die Anzahl der Teilwiedergaben verringern, um die Renderzeit für Ansichten zu verbessern?

Vielen Dank

Mr_Nizzle
quelle

Antworten:

5

Ich kenne keinen signifikanten Unterschied in der Renderleistung zwischen vielen Teilansichten und einer einzelnen Ansicht, wenn Sie denselben Inhalt rendern .

Wenn Sie in einigen Fällen nur einige Teilbilder und in anderen Fällen nur einige Teilbilder rendern, wodurch das Rendervolumen einer bestimmten Ansicht effektiv reduziert wird, können Sie möglicherweise an Geschwindigkeit gewinnen.

Andererseits habe ich immer Teilabstraktisierungen in Betracht gezogen, die mindestens an zwei verschiedenen Stellen verwendet werden sollten, um ihre Existenz zu rechtfertigen. Der andere Grund für die Verwendung von Partials besteht darin, dass Sie dieselbe Ansicht rendern möchten, jedoch unterschiedliche Partials laden möchten, basierend auf der von Ihnen verwendeten Geschäftslogik.

AKTUALISIEREN:

Ich kann keine Messung oder konkrete Zahlen zur Rendergeschwindigkeit anbieten. Wenn Sie einen Teil in einer Ansicht verwenden, rufen Sie zum Rendern die Rendermethode auf, sodass es einen zweiten Methodenaufruf gibt. Dies ist, wie ich in meiner Antwort sagte, fast nichts, kann aber dazu beitragen, die Dinge ein wenig zu beschleunigen.

Ich habe jedoch noch nie von einem Projekt gehört, das sein Leistungsproblem durch Entfernen von Teilbereichen behebt. Partials sind eine gute Möglichkeit, Ansichten einen Wiederverwendungsmechanismus anzubieten, und aus Sicht des Programmierers sollten sie für diesen Bereich verwendet werden. Sie sollten Abstractisierungen für gängige Konzepte in Views sein.

Ich habe an einem Projekt gearbeitet, bei dem Teilstriche übermäßig genutzt wurden. Nicht Rails, sondern die gleichen MVC-Prinzipien. Die Verwendung kleiner Teilstriche für alles, was Sie sich vorstellen können, macht es schwierig, sie zu finden, wenn Sie anfangen, Dutzende von ihnen zu haben. Wo würden Sie nach einem Eingang suchen, der geändert werden soll? In der Ansicht? Teilweise? In welchem ​​Teil gibt es 4 Teiltöne für diese Ansicht? ...

Nach einigen harten Umgestaltungen haben wir bei jeder Aktualisierung einer Ansicht die unnötigen Teileffekte entfernt. Sie sind nicht vollständig verschwunden, aber es bleiben für das Projekt gut definierte Abstractisierungen. Sie stellen gut verstandene Elemente dar (wie ein Baum für eine Art von Objekten oder einen bestimmten Listentyp), die sich in mehreren Ansichten in einer Form oder einer anderen wiederholen. Ich weiß, wenn ich einen Baum sehe, gibt es dafür einen Teil. Ich weiß, wenn ich bestimmte Arten von Listen sehe, dass es dafür einen Teil gibt. Ich habe sie nicht gejagt.

Codelesbarkeit ist das Wichtigste, was man für eine Software-Codebasis tun kann.

Patkos Csaba
quelle
Also, wenn ich nicht wirklich einen Teil brauche, wenn dieser Code nicht von einem anderen Controller wiederverwendet wird oder dynamisch neu geladen wird, sollte ich keine Teiltöne verwenden? und dies würde die Renderzeit der Views verbessern?
Mr_Nizzle
@Mr_Nizzle: Ich habe meine Antwort aktualisiert, um die Probleme abzudecken, die durch Ihren Kommentar entstanden sind. Ich hoffe, diese ausführliche Erklärung ist verständlicher ... Ich habe gerade festgestellt, dass mein zweiter Absatz in der Antwort missverstanden werden kann.
Patkos Csaba,
Danke Mann Code readability, darum geht es.
Mr_Nizzle
22

Ich bin mit beiden Antworten nicht einverstanden. Ich habe den Code von einem Teil in die Position kopiert und eingefügt, an der er im Teil der übergeordneten Ansicht vorhanden ist, und mit 500 Iterationen werden 600 ms weniger Zeit benötigt, um die Ansicht zu rendern. <% = xyz rendern%> ist meiner meinung nach sehr kaputt.

Beispiel, Gesamtzeit zum Rendern der Ansicht:

Before:
5759.8ms
5804.2ms
5973.6ms

After:
5268.7ms
5201.6ms
5222.4ms

Diff = 5846 - 5231 = 615 ms

Bearbeitet

Am Ende habe ich alle _Partials im _Model-Partial unDRYed und auf ~ 2000ms reduziert. Zu diesem Zeitpunkt habe ich versucht, das _Model-Partial in den Index zu verschieben. Dies hatte jedoch KEINE Auswirkungen auf die Renderzeiten macht es.

AJP
quelle
Interessante Entdeckung auf verschachteltem Teil. Meinten Sie unDRYing ein Teil reduziert 600ms und unDRYing alle Teil reduziert 3800ms? Könnten Sie die Demo-App dafür veröffentlichen?
Lulalala
@lulalala ja genau, und tut mir leid, ich kann nicht, wie es für meine Arbeit war, und ich habe es jetzt von Rails nach Django verlegt, so dass ich nicht einmal mehr mit diesem Code in Kontakt bin. Mit Blick auf Wyatt Barnett hat geantwortet , ich bin jetzt auch nicht sicher , ob tatsächlich unter der Haube der partials ineffizient DB Zugriffe Dabei wurden die mein unDRYed Code war irgendwie zu vermeiden.
AJP
1
Ich habe das Gleiche gefunden. Das Entfernen von Code aus Teilbereichen und das Aufheben der DRY-Funktion in der Ansicht führte ebenfalls zu einer Leistungssteigerung von ~ 450 ms.
bcackerman
1
Nach meiner Erfahrung mit Rails mit HAML-Ansichten verlangsamen viele kleine Partials das Rendern erheblich. Es scheint einen festen Overhead für jedes Teil zu geben, ebenso wie für die Garbage Collection, wenn viele Partials in einer Ansicht gerendert werden. Durch Inlining eines in einer Tabelle mit 50 Elementen verwendeten Teils wurde die Seitenwiedergabe um 500 ms verringert.
d4n3
2
Rails 4: Ich habe gerade ein paar tausend verschachtelte Partials in einer großen App entfernt und eine enorme Geschwindigkeitssteigerung erzielt. Ich habe die Zahlen nicht, aber ja, wenn Sie Leistungsprobleme haben, lohnt es sich, einige verschachtelte Partials zu entfernen, um zu sehen, ob es hilft.
Rick Smith
5

Kein Rails-Typ, aber Partial Views sind wahrscheinlich nicht das eigentliche Problem. Es klingt eher so, als würden Sie ein bisschen SELECT N + 1 machen. Sehen Sie sich die Dinge aus der Perspektive des DB-Servers an, um sicherzustellen, dass Sie sie nicht zu Brei schlagen.

Wyatt Barnett
quelle
2

Derzeit wird an einer Rails 4.2-App gearbeitet, bei der eine langsame Aktion im Durchschnitt ca. 745 ms dauerte.

Wenn ich den Code aus den Teilbereichen entferne und ihn in die Hauptvorlage einfüge, dauert es jetzt im Durchschnitt weniger als 25 ms.

Die Anzahl der Aufrufe zum Rendern der Teilnachrichten betrug nur 29.

Sammy Larbi
quelle
2

Auch wenn Sie kein n + 1-Problem haben und die gesamte Datenbank im Voraus bearbeiten (z. B. mit einem rekursiven CTE), sind verschachtelte Partials immer noch sehr langsam. Haml und Erb sehen beide langsam aus. On Rails 5.1.4 Ich sehe ein paar Millisekunden für jeden Teil plus gelegentliche Teiltöne, die viel schlimmer sind (wahrscheinlich entsprechend der Speicherbereinigung).

Ich habe festgestellt, dass beim Umbenennen des Teils, während eine dieser Anforderungen ausgeführt wird, sofort eine Fehlermeldung angezeigt wird, dass die Datei nicht gefunden wurde. Offensichtlich liest Rails die partielle Off-Platte, parst sie neu und wertet sie für jede Iteration aus. Kein Wunder, dass es langsam ist!

Paul A Jungwirth
quelle
0

Ein Großteil der Langsamkeit, die in verschachtelten Teilbereichen zu sehen ist, tritt nur während der Entwicklung auf. Wechseln Sie zum Testen in die Produktion.

Zapaf
quelle
Vielleicht können Sie sich dazu äußern, warum die Entwicklungsversion merklich langsamer ist und wann Sie welchen Modus für welche Tests verwenden sollten.
Kain0_0
Ehrlich gesagt kenne ich nicht alle Details, ich weiß nur, dass ich die gleichen Probleme hatte und fand, dass es viel verbessert wurde, als ich zur Produktion wechselte. Wie Paul Jungwirth bemerkte, geschieht das erneute Lesen des Teils und das erneute Analysieren während der Entwicklung, wenn sich Dateien geändert haben.
Zapaf