Szyny - czy używanie renderowania częściowego spowalnia wyświetlanie?

16

Mam problemy z wydajnością w 3.1.0aplikacji Rails , teraz zmieniłem kopułę w moich zapytaniach za pomocą AR, więc jednak widoki nadal renderują się zbyt długo, podzieliłem widoki, pętle i tak dalej, na wiele części, które są renderowane dynamicznie wewnątrz widoków i wewnątrz innych części.

Czy to zła praktyka mieć dużą liczbę częściowych?

Czy należy zmniejszyć liczbę części, aby poprawić czas renderowania widoków?

Dzięki

Mr_Nizzle
źródło

Odpowiedzi:

5

Nie znam żadnej istotnej różnicy w wydajności renderowania między wieloma częściami i jednym widokiem podczas renderowania tej samej treści.

Oczywiście, jeśli renderujesz tylko niektóre częściowe w niektórych przypadkach, a inne w innych przypadkach, takie jak skuteczne zmniejszenie głośności renderowania określonego widoku, możesz zyskać trochę prędkości.

Z drugiej strony zawsze rozważałem abstrakcje cząstkowe, które należy wykorzystać przynajmniej z 2 różnych miejsc, aby uzasadnić ich istnienie. Innym powodem korzystania z częściowych jest to, że chcesz renderować ten sam widok, ale ładować różne częściowe na podstawie posiadanej logiki biznesowej.

AKTUALIZACJA:

Nie mogę zaoferować pomiaru ani konkretnych liczb na temat prędkości renderowania. Jeśli używasz częściowego w widoku, aby go wyrenderować, wywołujesz metodę renderowania, więc istnieje drugie wywołanie metody. To, jak powiedziałem w mojej odpowiedzi, jest prawie niczym, ale może nieco przyspieszyć.

Jednak nigdy nie słyszałem o projekcie, który rozwiązuje problem z wydajnością poprzez usunięcie części. Częściowe są dobrym sposobem na zaoferowanie mechanizmu ponownego wykorzystania widoków iz punktu widzenia programistów powinny być używane w tym zakresie. Powinny być abstrakcjami typowych pojęć w widokach.

Pracowałem nad projektem, w którym częściowe były nadmiernie używane. Nie szyny, ale te same zasady MVC. Używanie małych cząsteczek do wszystkiego, co możesz sobie wyobrazić, sprawia, że ​​trudno je znaleźć, gdy zaczniesz mieć ich dziesiątki. Gdzie chciałbyś zmodyfikować dane wejściowe? W widoku? Częściowo? W której części znajdują się 4 częściowe tego widoku? ...

Po pewnych trudnych zmianach, przy każdej aktualizacji widoku usuwaliśmy niepotrzebne częściowe. Nie zniknęły całkowicie, ale pozostały abstrakcje, które są dobrze zdefiniowane dla projektu. Reprezentują one dobrze rozumiane elementy (takie jak drzewo dla pewnego rodzaju obiektów lub określonego typu listy), które powtarzają się w formie lub innej na kilku widokach. Wiem, jeśli widzę drzewo, że jest to częściowe. Wiem, kiedy widzę pewien rodzaj listy, że jest na to częściowa. Nie muszę ich tropić.

Czytelność kodu jest najważniejszą rzeczą, jaką można zrobić dla podstawy kodu oprogramowania.

Patkos Csaba
źródło
Tak więc w zasadzie, jeśli tak naprawdę nie potrzebuję częściowego, jeśli ten kod nie zostanie ponownie użyty przez inny kontroler lub przeładowany dynamicznie nie powinienem używać częściowych? i to poprawiłoby czas renderowania widoków?
Mr_Nizzle
@Mr_Nizzle: Zaktualizowałem moją odpowiedź, aby uwzględnić problemy związane z twoim komentarzem. Mam nadzieję, że to wyczerpujące wyjaśnienie jest bardziej zrozumiałe ... Właśnie zdałem sobie sprawę, że mój drugi akapit w odpowiedzi może być źle zrozumiany.
Patkos Csaba
Dzięki stary Code readability, o to w tym wszystkim chodzi.
Mr_Nizzle
22

Nie zgadzam się z obiema odpowiedziami. Skopiowałem i wkleiłem kod z częściowego do pozycji, w której jest on obecny w widoku nadrzędnym częściowo, a przy 500 iteracjach zajmuje to ogromnie 600 ms czasu potrzebnego do renderowania widoku. <% = render xyz%> jest moim zdaniem bardzo zepsuty.

Przykład: całkowity czas renderowania widoku:

Before:
5759.8ms
5804.2ms
5973.6ms

After:
5268.7ms
5201.6ms
5222.4ms

Diff = 5846 - 5231 = 615 ms

Edytowane

Skończyło się ODWRÓCANIE wszystkich _partials w części _model i sprowadziłem go do ~ 2000ms, w którym to momencie próbowałem przenieść _model częściowy do indeksu, jednak NIE miało to żadnego wpływu na czasy renderowania, więc myślę, że to z wywołaniami zagnieżdżonego renderowania, które czy to.

AJP
źródło
Ciekawe znalezisko na częściowym zagnieżdżeniu. Czy chodziło Ci o anulowanie suszenia częściowego o 600 ms, a usunięcie suszenia wszystkich częściowych o 3800ms? Czy możesz w tym celu wydać aplikację demo?
lulalala
@lulalala tak dokładnie i przepraszam, że nie mogę, jak to było w przypadku mojej pracy i teraz przeniosłem ją z Rails do Django, więc nawet nie mam już kontaktu z tym kodem. Patrząc na Wyatta Barnetta, odpowiedziałem , teraz też nie jestem pewien, czy faktycznie pod maską częściowe robiły nieefektywne dostępy do bazy danych, których mój unikalny kod w jakiś sposób unikał.
AJP
1
Znalazłem to samo. Wyjmowanie kodu z części i odsłanianie widoku dało mi również wzrost wydajności o ~ 450 ms.
bcackerman
1
Z mojego doświadczenia w korzystaniu z Railsów z widokami HAML, wiele małych części jest znacznie wolniej renderowanych. Wydaje się, że na każdym częściowym jest ustalony narzut, a także wyrzucanie elementów bezużytecznych podczas renderowania wielu części w widoku. Wprowadzenie częściowej części w tabeli zawierającej 50 elementów zmniejszyło renderowanie strony o 500 ms.
d4n3,
2
Rails 4: Właśnie usunąłem kilka tysięcy zagnieżdżonych części w dużej aplikacji i otrzymałem ogromne przyspieszenie. Nie mam liczb, ale tak, jeśli masz problemy z wydajnością, warto usunąć niektóre zagnieżdżone części, aby sprawdzić, czy to pomaga.
Rick Smith,
5

Nie jest facetem od szyn, ale Częściowe Widoki prawdopodobnie nie stanowią problemu per se. Raczej wygląda na to, że wykonujesz trochę WYBORU N + 1. Spójrz na rzeczy z perspektywy serwera DB, aby upewnić się, że nie bijesz go w miazgę.

Wyatt Barnett
źródło
2

Pracuję teraz w aplikacji Rails 4.2, gdzie powolne działanie trwało średnio około 745 ms.

Kiedy usuwam kod z części i umieszczam go w głównym szablonie, czas potrzebny jest teraz średnio poniżej 25 ms.

Liczba wywołań częściowych wyniosła tylko 29.

Sammy Larbi
źródło
2

Nawet jeśli nie masz problemu n + 1 i wykonujesz całą pracę bazy danych z góry (powiedzmy z rekurencyjnym CTE), zagnieżdżone części są nadal bardzo wolne. Haml i Erb patrzą na mnie powoli. Na Railsach 5.1.4 widzę kilka milisekund dla każdej części, plus sporadyczne części, które są znacznie gorsze (prawdopodobnie odpowiadające odśmiecaniu).

Zauważyłem, że jeśli zmienię nazwę częściową, gdy jedno z tych żądań jest uruchomione, natychmiast pojawia się błąd dotyczący tego, że plik nie został znaleziony. Najwyraźniej Railsy odczytują częściowe dyski, analizują je i oceniają dla każdej iteracji. Nic dziwnego, że jest wolny!

Paul A Jungwirth
źródło
0

Wiele spowolnienia widocznego w zagnieżdżonych częściach cząstkowych zdarza się tylko podczas opracowywania. Przejdź do produkcji, aby przetestować.

Zapaf
źródło
Być może mógłbyś skomentować, dlaczego wersja programistyczna jest znacznie wolniejsza i być bardziej dopracowanym, kiedy używać którego trybu do jakiego testowania.
Kain0_0
szczerze mówiąc, nie znam wszystkich szczegółów, po prostu wiem, że miałem te same problemy i odkryłem, że uległo to znacznej poprawie po przejściu na produkcję. Mogę zgadywać, że jak zauważył Paul Jungwirth, ponowne przeczytanie częściowe i ponowna analiza ma miejsce podczas programowania, gdy pliki mogły ulec zmianie.
Zapaf