2012-06-27 23 views
5

ब्रैड विल्सन के अनुसार, RenderAction RenderPartial की तुलना में धीमी है।RenderAction बनाम RenderPartial प्रदर्शन

हालांकि, क्या किसी को भी कोई आंकड़ा मिला है जो प्रदर्शन में अंतर दिखाता है?

मैं कहाँ पृष्ठों "विजेट" का बना रहे हैं एक आवेदन विकसित करने की प्रक्रिया में हूँ। प्रत्येक विजेट के लिए देखें स्तर

कॉल RenderAction पर

संरचना:

मैं दो विकल्प हैं। यह अब तक का सबसे आसान दृष्टिकोण है लेकिन इसका मतलब यह है कि हम प्रत्येक विजेट के लिए एक पूर्ण एमवीसी चक्र कर रहे हैं।

पेज है कि डेटा हम एक विजेट के लिए आवश्यकता होती है के लिए नियंत्रक स्तर

लिखें एक ViewModel पर रचना। प्रत्येक विजेट के लिए रेंडरपार्टियल कॉल करें। यह लागू करने के लिए बहुत जटिल है लेकिन इसका मतलब है कि हम केवल एक एमवीसी चक्र बनाएंगे।

मैं एक पृष्ठ पर 3 विभिन्न विजेट के साथ ऊपर दृष्टिकोण का परीक्षण किया और समय प्रस्तुत करना में अंतर एक दूसरे के 10ths (शायद ही लायक के बारे में चिंता) था।

हालांकि, किसी को भी किसी भी परीक्षण के परिणाम इस से भी अधिक ठोस, या शायद अनुभव दोनों दृष्टिकोण की कोशिश कर रहा गया है?

उत्तर

3

2 और अधिक विकल्प सुझाव देंगे, दोनों नियंत्रक स्तर पर दृश्य मॉडल की रचना करने की आवश्यकता होती है और दोनों एक साथ काम कर सकते हैं (डेटा के आधार पर)

  1. Html.DisplayFor() - प्रदर्शन टेम्पलेट्स
  2. एक्सटेंशन विधियों के माध्यम से हेल्पर्स

विकल्प 2 बहुत अच्छी तरह से काम करता है यदि आप उन विजेट को अलग-अलग असेंबली में रखना चाहते हैं, तो वे केवल एक स्ट्रिंग लौटने के लिए काम कर रहे हैं। मुझे लगता है कि यह भी सबसे अच्छा प्रदर्शन है, लेकिन निश्चित रूप से आप 'डिजाइनर अनुकूल' टेम्पलेट खो देते हैं। मुझे लगता है कि रखरखाव पहलू पर विचार करना महत्वपूर्ण है, न केवल कच्चे प्रदर्शन (जब तक आपको वास्तव में इसकी आवश्यकता नहीं होती है, और फिर भी, कैशिंग अधिक सहायक होती है)।

छोटे सामान (तारीख या नाम स्वरूपण आदि) मैं, सहायकों का उपयोग करेंगे के बाद से एचटीएमएल आम तौर पर एक वर्ग के साथ एक अवधि है, और अधिक जटिल सामान के लिए मैं प्रदर्शन टेम्पलेट का उपयोग होता है।

+0

+1। मैं वर्तमान में विजेट को प्रतिपादन जिम्मेदारी सौंप रहा हूं इसलिए मैं केवल '@ widget.Render (HTML)' कहता हूं और विजेट स्वयं को प्रस्तुत करने के लिए 'HtmlHelper' का उपयोग कर सकता है। उस ने कहा, मैं इस प्रतिनिधिमंडल को वैकल्पिक बना सकता हूं और डिफ़ॉल्ट रूप से 'DisplayFor() 'को कॉल कर सकता हूं। –

3

मैं हाल ही में एक आवेदन है कि प्रदर्शन के मुद्दों सामना कर रहा था पर काम किया है, और एक राय यह है कि RenderAction करने के लिए चार कॉल करने गया था, के साथ साथ लेआउट में एक दूसरे से मिल गया। मैंने पाया कि प्रत्येक कॉलर रेंडरएक्शन - यहां तक ​​कि जब मैंने एक डमी एक्शन में जोड़ा जो खाली दृश्य लौटाता है - लगभग 200-300ms (मेरी स्थानीय मशीन पर) लेता है। कॉल की संख्या से गुणा करें और आपके पास पृष्ठ पर एक बड़ा प्रदर्शन मारा गया है। मेरे मामले में चार कॉलें अनावश्यक सर्वर-साइड ओवरहेड के एक दूसरे के कारण हुईं। तुलनात्मक रूप से, रेंडरपार्टियल को कॉल 0-10ms के क्षेत्र के आसपास थे।

मैं रेंडरपर्टियल के पक्ष में जहां भी संभव हो, रेंडरएक्शन का उपयोग करने से बचूंगा। सभी आवश्यक जानकारी लौटने के लिए नियंत्रक जिम्मेदार होना चाहिए। विगेट्स के मामले में, यदि आपको कई विगेट्स के लिए कई कार्रवाइयों की आवश्यकता है, तो मैं उन्हें एक क्रिया में लिखने की कोशिश करता हूं ताकि रेंडरएक्शन ओवरहेड केवल एक बार होता है, हालांकि यदि आपकी साइट पर्याप्त रूप से निष्पादित करती है तो मैं उन्हें क्लीनर डिज़ाइन के लिए अलग रखूंगा।

संपादित करें: मैंने इस जानकारी को मिनीप्रोफाइलर का उपयोग करके और साइट पर टक्कर मार दी। यह सुपर सटीक नहीं है लेकिन यह स्पष्ट रूप से मतभेद दिखाता है।

संपादित करें: जैसा कि ओस्कर ने नीचे बताया है, प्रश्न में आवेदन में कुछ गहन कोड था जो वैश्विक अनुरोध में प्रत्येक अनुरोध के लिए चलता है। इस हिट की परिमाण आवेदन कोड पर निर्भर करेगी, लेकिन रेंडरपार्टियल एक और एमवीसी चक्र को पूरी तरह से निष्पादित करने से बचेंगी। DisplayFor() सुझाव के लिए

+2

मुझे संदेह है कि रेंडरएक्शन() हमेशा 200ms + होता है - यदि रेंडरएक्शन() हमेशा 200ms होता है तो उसी "खाली-दृश्य" कार्रवाई के लिए ब्राउज़र अनुरोध कम से कम 200ms होना चाहिए। लेकिन चूंकि सामान्य रूप से ब्राउज़र अनुरोध 10-20ms जितना तेज़ हो सकते हैं, ऐसा लगता है कि प्रश्न में आवेदन में कुछ भारी कोड (उदा। ग्लोबल.एक्सएक्स में) है जो प्रत्येक अनुरोध के लिए चलता है। –

+0

@ ओस्कर यह सच है। मैंने तब से काम नहीं किया है, लेकिन मुझे पता है कि इसमें कुछ गंभीर समस्याएं थीं। यह केवल यह स्पष्ट करने के लिए है कि 'RenderPartial()' के समान दिखाई देने के बावजूद 'RenderAction()' में निहित अंतर्निहित एमवीसी चक्र का बड़ा प्रदर्शन अंतर हो सकता है। – mao47

संबंधित मुद्दे