Rails - Apakah menggunakan rendering pandangan lambat sebagian?

16

Saya mengalami masalah kinerja pada 3.1.0aplikasi Rails , sekarang saya telah melakukan perubahan kubah pada permintaan saya dengan AR dan begitu tetapi pandangan masih membutuhkan terlalu banyak waktu untuk merender, saya telah membagi pandangan, loop dan sebagainya, pada banyak bagian yang diberikan secara dinamis di dalam tampilan dan di dalam parsial lainnya.

Jadi itu praktik yang buruk untuk memiliki banyak parsial?

Haruskah saya mengurangi jumlah parsial untuk meningkatkan waktu rendering tampilan?

Terima kasih

Mr_Nizzle
sumber

Jawaban:

5

Saya tahu tidak ada perbedaan kinerja rendering yang signifikan antara banyak parsial dan satu tampilan tunggal ketika Anda merender konten yang sama .

Jelas, jika Anda membuat hanya sebagian sebagian dalam beberapa kasus dan lain-lain dalam kasus lain, secara efektif mengurangi volume rendering dari tampilan tertentu, daripada Anda mungkin mendapatkan beberapa kecepatan.

Di sisi lain, saya selalu mempertimbangkan abstrakisasi parsial yang harus digunakan setidaknya dari 2 tempat yang berbeda untuk membenarkan keberadaan mereka. Alasan lain untuk menggunakan parsial adalah ketika Anda ingin membuat tampilan yang sama tetapi memuat parsial berbeda berdasarkan beberapa logika bisnis yang Anda miliki.

MEMPERBARUI:

Saya tidak dapat menawarkan pengukuran atau angka konkret tentang kecepatan rendering. Jika Anda menggunakan sebagian dalam tampilan, untuk merendernya Anda memanggil metode render, jadi ada panggilan metode kedua. Ini, seperti yang saya katakan dalam jawaban saya, hampir tidak ada tetapi dapat membantu mempercepat sedikit.

Namun saya tidak pernah mendengar proyek memperbaiki masalah kinerjanya dengan menghapus sebagian. Sebagian adalah cara yang baik untuk menawarkan mekanisme penggunaan kembali untuk pandangan dan dari pandangan programmer mereka harus digunakan untuk lingkup itu. Mereka harus abstrakisasi untuk konsep umum dalam pandangan.

Saya bekerja pada sebuah proyek di mana sebagian digunakan secara berlebihan. Bukan Rails, tetapi prinsip-prinsip MVC yang sama. Menggunakan parsial kecil untuk semua yang dapat Anda bayangkan membuatnya sulit ditemukan ketika Anda mulai memiliki lusinan. Di mana Anda akan mencari input yang akan dimodifikasi? Dalam tampilan? Secara parsial? Di bagian mana, ada 4 bagian untuk tampilan ini? ...

Setelah beberapa perbaikan keras, dengan setiap pembaruan tampilan, kami menghapus sebagian yang tidak perlu. Mereka tidak hilang sepenuhnya, tetapi yang tersisa adalah abstrakisasi yang didefinisikan dengan baik untuk proyek tersebut. Mereka mewakili elemen yang dipahami dengan baik (seperti pohon untuk beberapa jenis objek, atau jenis daftar tertentu) yang diulang dalam bentuk atau lainnya pada beberapa tampilan. Saya tahu jika saya melihat pohon bahwa ada sebagian untuk itu. Saya tahu ketika saya melihat jenis daftar tertentu yang ada sebagian untuk itu. Saya tidak harus memburu mereka.

Keterbacaan kode adalah hal terpenting yang dapat dilakukan seseorang untuk basis kode perangkat lunak.

Patkos Csaba
sumber
Jadi pada dasarnya, jika saya tidak benar-benar membutuhkan sebagian, jika kode itu tidak akan digunakan kembali oleh pengontrol lain o dimuat ulang secara dinamis saya tidak boleh menggunakan parsial? dan ini akan meningkatkan waktu tampilan rendering?
Mr_Nizzle
@Mr_Nizzle: Saya memperbarui jawaban saya untuk menutupi masalah yang muncul dari komentar Anda. Saya harap penjelasan yang dikeluarkan ini lebih dapat dimengerti ... Saya baru menyadari bahwa paragraf kedua saya dalam jawaban dapat disalahpahami.
Patkos Csaba
Terima kasih kawan Code readability, itu semua tentang.
Mr_Nizzle
22

Saya tidak setuju dengan kedua jawaban itu. Saya telah menyalin dan menempelkan kode dari sebagian ke posisi yang ada dalam tampilan induk parsial dan dengan 500 iterasi, ini membutuhkan 600ms besar dari waktu yang diperlukan untuk membuat tampilan. <% = render xyz%> menurut saya sangat rusak.

Contoh, total waktu untuk membuat tampilan:

Before:
5759.8ms
5804.2ms
5973.6ms

After:
5268.7ms
5201.6ms
5222.4ms

Diff = 5846 - 5231 = 615 ms

Diedit

Saya akhirnya menghapus semua _partials dalam parsial _model dan mendapatkannya ke ~ 2000ms, pada saat itu saya mencoba memindahkan parsial _model ke dalam indeks namun ini TIDAK memiliki pengaruh pada rendering kali jadi saya kira itu dengan panggilan untuk membuat bersarang membuat melakukannya.

AJP
sumber
Temuan menarik di parsial bersarang. Apakah maksud Anda membatalkan satu parsial mengurangi 600 ms, dan menghapus semua parsial mengurangi 3800 ms? Bisakah Anda merilis aplikasi demo untuk itu?
lulalala
@ lalalala ya persis, dan maaf saya tidak bisa seperti itu untuk pekerjaan saya dan saya sekarang sudah memindahkannya dari Rails ke Django sehingga bahkan tidak berhubungan dengan kode itu lagi. Melihat Wyatt Barnett telah menjawab , saya juga sekarang tidak yakin apakah benar-benar di bawah tenda para pihak melakukan akses DB yang tidak efisien yang entah bagaimana dihindari oleh kode unDRYed saya.
AJP
1
Saya menemukan hal yang sama. Mengambil kode dari parsial dan unDRYing up view memberi saya ~ 450ms peningkatan kinerja juga.
bcackerman
1
Dalam pengalaman saya menggunakan Rails dengan tampilan HAML, banyak parsial kecil memperlambat rendering secara signifikan. Tampaknya ada overhead tetap untuk setiap parsial, serta pengumpulan sampah yang menendang ketika membuat banyak parsial dalam tampilan. Menguraikan parsial yang digunakan dalam tabel 50 item mengurangi rendering halaman sebesar 500 ms.
d4n3
2
Rails 4: Saya baru saja menghapus beberapa ribu parsial bersarang pada aplikasi besar dan mendapat speedup besar. Tidak memiliki angka, tetapi ya, jika Anda mengalami masalah kinerja, ada baiknya menghapus beberapa parsial bersarang untuk melihat apakah itu membantu.
Rick Smith
5

Bukan orang yang suka rel, tapi Partial Views sepertinya bukan masalah. Sebaliknya, sepertinya Anda melakukan sedikit SELECT N +1. Lihat hal-hal dari perspektif server DB untuk memastikan Anda tidak mengalahkannya.

Wyatt Barnett
sumber
2

Bekerja pada aplikasi Rails 4.2 saat ini di mana tindakan lambat yang mengambil rata-rata sekitar 745 ms.

Ketika saya menghapus kode dari parsial dan menempatkannya ke templat utama, waktu yang dibutuhkan sekarang rata-rata kurang dari 25 ms.

Jumlah panggilan untuk membuat parsial hanya 29.

Sammy Larbi
sumber
2

Bahkan jika Anda tidak memiliki masalah n +1 dan melakukan semua pekerjaan database di depan (katakanlah dengan CTE rekursif), parsial bersarang masih sangat lambat. Haml dan Erb keduanya tampak lambat bagiku. Pada Rel 5.1.4 Saya melihat beberapa milidetik untuk setiap parsial, ditambah sesekali parsial yang jauh lebih buruk (mungkin terkait dengan pengumpulan sampah).

Saya perhatikan bahwa jika saya mengganti nama sebagian saat salah satu permintaan ini berjalan, saya segera mendapatkan kesalahan tentang bagaimana file tidak ditemukan. Jadi rupanya Rails membaca sebagian dari disk, mem-reparsing, dan mengevaluasinya untuk setiap iterasi. Tidak heran lambat!

Paul A Jungwirth
sumber
0

Banyak kelambatan yang terlihat pada parsial bersarang hanya terjadi selama perkembangan. Beralih ke produksi untuk menguji.

Zapaf
sumber
Mungkin Anda bisa berkomentar mengapa versi pengembangan lebih lambat, dan lebih bernuansa kapan harus menggunakan mode mana untuk pengujian apa.
Kain0_0
terus terang saya tidak tahu semua detail, saya hanya tahu saya mengalami masalah yang sama, dan menemukan itu jauh lebih baik ketika saya beralih ke produksi. Saya bisa menebak bahwa seperti yang diperhatikan oleh Paul Jungwirth, membaca ulang parsial dan mem-reparsing, terjadi selama pengembangan ketika file mungkin telah berubah.
Zapaf