रेल्स - क्या धारावाहिकों के धीमी गति से प्रस्तुतिकरण का उपयोग करता है?


16

मैं एक रेल 3.1.0अनुप्रयोग पर प्रदर्शन समस्याएँ कर रहा हूं , अब मैंने AR के साथ अपने प्रश्नों पर कई बदलाव किए हैं और इसलिए अभी भी रेंडर करने में बहुत अधिक समय लगता है, मैंने विचारों को विभाजित किया है, लूप्स और इसलिए, कई भाग पर विचारों के अंदर और अन्य भाग के अंदर गतिशील रूप से प्रस्तुत किए जाते हैं।

इसलिए बड़ी संख्या में भाग्यांक होना एक बुरी बात है?

क्या मुझे समय प्रदान करने वाले विचारों को बेहतर बनाने के लिए भागमभाग की संख्या कम करनी चाहिए?

धन्यवाद

जवाबों:


5

जब आप एक ही सामग्री प्रस्तुत करते हैं, तो मैं कई सारे धारावाहिकों और एक दृश्य के बीच कोई महत्वपूर्ण प्रतिपादन प्रदर्शन अंतर नहीं जानता ।

जाहिर है, यदि आप कुछ मामलों में केवल कुछ भाग और अन्य मामलों में अन्य को प्रस्तुत करते हैं, जैसे कि एक विशिष्ट दृश्य के प्रतिपादन की मात्रा को प्रभावी ढंग से कम करना, तो आप कुछ गति प्राप्त कर सकते हैं।

दूसरी ओर, मैंने हमेशा ऐसे भाग अमूर्तताओं पर विचार किया, जिनका उपयोग उनके अस्तित्व को सही ठहराने के लिए कम से कम 2 अलग-अलग स्थानों से किया जाना चाहिए। आंशिक उपयोग करने का दूसरा कारण यह है कि जब आप एक ही दृश्य प्रस्तुत करना चाहते हैं, लेकिन आपके पास कुछ व्यावसायिक तर्क के आधार पर अलग-अलग भाग लोड करते हैं।

अपडेट करें:

मैं रेंडरिंग स्पीड के बारे में माप या कुछ ठोस संख्याओं की पेशकश नहीं कर सकता। यदि आप एक दृश्य में एक आंशिक का उपयोग करते हैं, तो इसे रेंडर करने के लिए आप रेंडर विधि कहते हैं, इसलिए एक दूसरी विधि कॉल है। जैसा कि मैंने अपने जवाब में कहा, यह लगभग कुछ भी नहीं है, लेकिन चीजों को बहुत कम गति देने में मदद कर सकता है।

हालाँकि मैंने कभी किसी प्रोजेक्ट के बारे में यह नहीं सुना कि वह पार्टिकल्स को हटाकर अपनी परफॉर्मेंस प्रॉब्लम को ठीक करे। भागमभाग विचारों को पुन: उपयोग तंत्र की पेशकश करने का एक अच्छा तरीका है और प्रोग्रामर के दृष्टिकोण से उन्हें उस दायरे के लिए उपयोग किया जाना चाहिए। विचारों में सामान्य अवधारणाओं के लिए उन्हें अमूर्त होना चाहिए।

मैंने एक ऐसी परियोजना पर काम किया, जिसमें आंशिक रूप से अत्यधिक उपयोग किया गया। रेल नहीं, बल्कि MVC के सिद्धांत। उन सभी चीज़ों के लिए छोटे हिस्से का उपयोग करना जो आप कल्पना कर सकते हैं कि जब आप उनमें से दर्जनों के लिए शुरू करते हैं तो उन्हें ढूंढना मुश्किल हो जाता है। आप संशोधित किए जाने वाले इनपुट की तलाश कहां करेंगे? दृश्य में? एक आंशिक में? किस भाग में, इस दृश्य के लिए 4 भाग हैं? ...

कुछ कठिन रिफ्लेक्टरिंग के बाद, एक दृश्य के प्रत्येक अद्यतन के साथ, हमने अनावश्यक भाग निकाल दिए। वे पूरी तरह से गायब नहीं हुए, लेकिन जो बने रहे वे अमूर्तताएं हैं जो परियोजना के लिए अच्छी तरह से परिभाषित हैं। वे अच्छी तरह से समझे गए तत्वों का प्रतिनिधित्व करते हैं (कुछ प्रकार की वस्तुओं के लिए एक पेड़ की तरह, या एक विशिष्ट सूची प्रकार) जो कई दृश्यों पर एक रूप या अन्य में दोहराते हैं। मुझे पता है कि क्या मैं एक पेड़ देखता हूं कि उसके लिए एक आंशिक है। मुझे पता है कि जब मैं कुछ प्रकार की सूची देखता हूं तो उसके लिए एक आंशिक है। मैं उन्हें नीचे शिकार नहीं है।

कोड पठनीयता एक सॉफ्टवेयर कोड आधार के लिए सबसे महत्वपूर्ण चीज है।


इसलिए मूल रूप से, अगर मुझे वास्तव में एक आंशिक की आवश्यकता नहीं है, अगर उस कोड का पुन: उपयोग नहीं किया जाएगा अन्य नियंत्रक ओ पुनः लोड गतिशील रूप से मैं भाग का उपयोग नहीं करना चाहिए? और यह समय प्रतिपादन विचारों में सुधार होगा?
Mr_Nizzle

@Mr_Nizzle: मैंने आपकी टिप्पणी द्वारा गुलाब की समस्याओं को कवर करने के लिए अपना जवाब अपडेट किया। मुझे उम्मीद है कि यह विस्तृत स्पष्टीकरण अधिक समझने योग्य है ... मुझे बस एहसास हुआ कि उत्तर में मेरा दूसरा पैराग्राफ गलत समझा जा सकता है।
पटकोस ससाबा

धन्यवाद आदमी Code readability, यही सब कुछ है।

22

मैं दोनों जवाबों से असहमत हूं। मैंने कोड को आंशिक से उस स्थिति में कॉपी और पेस्ट किया है, जो कि पेरेंट व्यू में मौजूद है और 500 पुनरावृत्तियों के साथ, यह दृश्य रेंडर करने में लगने वाले समय से 600 मील की दूरी पर है। <% = xyz% प्रस्तुत करना> मेरी राय में बहुत टूट गया है।

उदाहरण, दृश्य प्रस्तुत करने का कुल समय:

Before:
5759.8ms
5804.2ms
5973.6ms

After:
5268.7ms
5201.6ms
5222.4ms

Diff = 5846 - 5231 = 615 ms

संपादित

मैंने _model आंशिक के भीतर सभी _partials को अनधिकृत रूप से समाप्त कर दिया और इसे ~ 2000ms में नीचे कर दिया, जिस बिंदु पर मैंने _model को आंशिक रूप से अनुक्रमणिका में ले जाने का प्रयास किया, हालांकि इससे रेंडरिंग समय पर कोई प्रभाव नहीं पड़ा, इसलिए मुझे लगता है कि इसे नेस्टेड रेंडर के लिए कॉल किया गया है क्या यह।


नेस्टेड आंशिक पर दिलचस्प खोज। क्या आपका मतलब है कि एक आंशिक घटाकर 600ms, और सभी भाग को कम करके 3800ms कम कर दिया गया? क्या आप इसके लिए डेमो ऐप जारी कर सकते हैं?
लूलालाल

@ लालालाला बिल्कुल ठीक है, और खेद है कि मैं अपने काम के लिए ऐसा नहीं कर सका और मैंने अब इसे रेल से हटाकर जिआंगो कर दिया है, इसलिए अब उस कोड के संपर्क में भी नहीं हूं। को देखते हुए व्याट बार्नेट उत्तर दिया है , मैं भी अब कर रहा हूँ यकीन नहीं करता है, तो वास्तव में हुड के नीचे आंशिक अक्षम डीबी पहुंच जो मेरे unDRYed कोड किसी भी तरह से परहेज किया गया था कर रहे थे।
एजेपी

1
मैंने वही पाया है। भाग से बाहर कोड लेने और देखने के बिना मुझे ~ 450ms प्रदर्शन वृद्धि के रूप में अच्छी तरह से दिया।
bcackerman

1
HAML विचारों के साथ रेल का उपयोग करने के मेरे अनुभव में, बहुत से छोटे भाग बहुत धीमी गति से प्रतिपादन करते हैं। हर आंशिक के लिए एक निश्चित ओवरहेड प्रतीत होता है, साथ ही कचरे के संग्रह में किकिंग होती है जब एक दृश्य में बहुत सारे भाग दिए जाते हैं। 50 आइटमों की तालिका में उपयोग किए जाने वाले आंशिक को सम्मिलित करने से पृष्ठ रेंडरिंग 500 एमएस से कम हो गई।
d4n3

2
रेल्स 4: मैंने अभी एक बड़े ऐप पर कुछ हज़ार नेस्टेड पार्टिकल्स निकाले और बहुत बड़ा स्पीडअप लिया। संख्या नहीं है, लेकिन हाँ, अगर आपको प्रदर्शन की समस्या हो रही है, तो यह देखने में मदद करेगा कि यह देखने में कुछ नेस्टेड भाग को हटाने के लायक है।
रिक स्मिथ

5

एक रेल आदमी नहीं है, लेकिन आंशिक दृश्य की संभावना नहीं है कि प्रति समस्या है। बल्कि, ऐसा लगता है कि आप SELECT N + 1 का एक सा कर रहे हैं। डीबी सर्वर के दृष्टिकोण से चीजों को देखें यह सुनिश्चित करने के लिए कि आप इसे लुगदी के लिए नहीं मार रहे हैं।


2

अभी एक रेल 4.2 ऐप पर काम कर रहा है, जहां एक धीमी कार्रवाई जो औसतन लगभग 745ms ले रही थी।

जब मैं भाग से कोड निकालता हूं और इसे मुख्य टेम्पलेट में रखता हूं, तो जो समय लगता है वह अब 25ms से कम है।

धारावाहिकों को प्रस्तुत करने के लिए कॉल की संख्या केवल 29 थी।


2

भले ही आपको कोई n + 1 समस्या न हो और सभी डेटाबेस सामने काम करते हैं (एक पुनरावर्ती CTE के साथ कहते हैं), नेस्टेड भाग अभी भी बहुत धीमे हैं। Haml और Erb दोनों ही मुझे धीमे लगते हैं। रेल पर 5.1.4 मैं प्रत्येक आंशिक, साथ ही सामयिक भाग के लिए कुछ मिलीसेकंड देख रहा हूं जो बहुत खराब हैं (शायद कचरा संग्रह के अनुरूप)।

मैंने देखा कि अगर मैं इन अनुरोधों में से एक को चला रहा हूं, तो मैं आंशिक नाम बदल देता हूं, मुझे तुरंत एक त्रुटि मिलती है कि फाइल कैसे नहीं मिली। तो जाहिर है कि रेल आंशिक डिस्क को पढ़ रही है, इसे पुन: प्रस्तुत कर रही है, और प्रत्येक पुनरावृत्ति के लिए इसका मूल्यांकन कर रही है। कोई आश्चर्य नहीं कि यह धीमा है!


0

बहुत सारे धीमेपन को नेस्टेड पार्टिकल्स में देखा जाता है जो केवल विकास के दौरान होता है। परीक्षण के लिए उत्पादन पर स्विच करें।


शायद आप इस बात पर टिप्पणी कर सकते हैं कि विकास संस्करण सराहनीय रूप से धीमा क्यों है, और किस परीक्षण के लिए किस मोड का उपयोग करना है, इसके बारे में अधिक बारीकियों के बारे में बताया गया है।
Kain0_0

स्पष्ट रूप से मैं सभी विवरणों को नहीं जानता, मुझे पता है कि मैं एक ही मुद्दे पर चल रहा था, और पाया कि जब मैंने उत्पादन पर स्विच किया तो यह बहुत सुधार हुआ था। मैं अनुमान लगा सकता हूं कि जैसा कि पॉल जुंगविर्थ ने देखा, आंशिक और पुनरावर्ती की पुनरावृत्ति, विकास के दौरान होती है जब फाइलें बदल सकती हैं।
ज़ियाफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.