जवाबों:
सुधार के संभावित स्रोतों की संकलित सूची नीचे दी गई है:
सामान्य
कैशिंग
CompiledQuery.Compile()
अपनी क्वेरी अभिव्यक्तियों के पुन: उपयोग से बचने के लिए पुनरावर्ती उपयोग करेंOutputCacheAttribute
अनावश्यक और कार्रवाई के निष्पादन को बचाने के लिए कैश-प्रवण-से-परिवर्तन सामग्री का उपयोग न करेंActionResult
यदि आवश्यक हो तो अपने कस्टम तरीकों को लिखेंRouteName
अपने मार्गों को व्यवस्थित करने के लिए उपयोग करने पर विचार करें और फिर अपने लिंक बनाने के लिए इसका उपयोग करें, और अभिव्यक्ति ट्री आधारित एक्शनलिंक विधि का उपयोग न करने का प्रयास करें।PartialViews
, इसे xxxx बार रेंडर करने से बचें : यदि आप एक ही दृश्य में एक ही आंशिक 300 बार कॉल करते हैं, तो शायद इसमें कुछ गड़बड़ है। स्पष्टीकरण और बेंचमार्करूटिंग
Url.RouteUrl("User", new { username = "joeuser" })
मार्गों को निर्दिष्ट करने के लिए उपयोग करें । रूडी बेनकोविक द्वारा ASP.NET MVC परफ्यूम
रूडी बेनकोविक द्वारा इस हेल्पर ASP.NET MVC परफॉमेंस का उपयोग करके कैशे रूट का समाधानUrlHelperCached
सुरक्षा
दाल
भार संतुलन
अपने ऐप इंस्टेंट में क्लाइंट लोड को फैलाने के लिए, रिवर्स प्रॉक्सी का उपयोग करें। (स्टैक ओवरफ्लो HAProxy ( MSDN ) का उपयोग करता है ।
बाहरी संसाधनों के प्रसंस्करण पर निर्भर कार्यों को लागू करने के लिए अतुल्यकालिक नियंत्रकों का उपयोग करें ।
ग्राहक की ओर
वैश्विक विन्यास
यदि आप रेज़र का उपयोग करते हैं, तो अपने Global.asax.cs में निम्न कोड जोड़ें, डिफ़ॉल्ट रूप से, Asp.Net MVC, एक एस्पक्स इंजन और रेज़र इंजन के साथ प्रस्तुत करता है। यह केवल RazorViewEngine का उपयोग करता है।
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
अपने web.config में gzip (HTTP कम्प्रेशन) और स्टैटिक कैश (चित्र, css, ...) जोड़ें
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
मूल सुझाव REST सिद्धांतों का पालन करना है और निम्नलिखित बिंदुओं में से कुछ प्रिंसिपलों को ASP.NET MVC फ्रेमवर्क में शामिल किया गया है:
कोड क्लाइंबर और यह ब्लॉग प्रविष्टि, आवेदन के प्रदर्शन को बढ़ाने के विस्तृत तरीके प्रदान करती है।
संकलित क्वेरी आपके एप्लिकेशन के प्रदर्शन को बढ़ाएगी, लेकिन इसमें ASP.NET MVC के साथ कुछ भी सामान्य नहीं है। यह हर db एप्लिकेशन को गति देगा, इसलिए यह वास्तव में MVC के बारे में नहीं है।
यह स्पष्ट लग सकता है, लेकिन अपनी साइट को रिलीज़ मोड में चलाएं, न कि डिबग मोड, जब उत्पादन में, और प्रदर्शन प्रोफाइलिंग के दौरान भी। रिलीज़ मोड बहुत तेज़ है। डिबग मोड अपने स्वयं के कोड में प्रदर्शन समस्याओं को छिपा सकता है।
LINQ के माध्यम से डेटा एक्सेस करते समय IQueryable पर भरोसा करें ...
सूची () के बजाय AsQueryable () का उपयोग क्यों करें?
... और एक अच्छा रिपोजिटरी पैटर्न का लाभ उठाएं:
रिपॉजिटरी पैटर्न में सबरकार्ड लोड कर रहा है
यह डेटा एक्सेस को यह सुनिश्चित करने के लिए अनुकूलित करेगा कि केवल आवश्यक डेटा लोड किया गया है और जब केवल इसकी आवश्यकता है।
पृथ्वी-टूटने का अनुकूलन नहीं है, लेकिन मुझे लगा कि मैं इसे वहां फेंक दूंगा - सीडीएन के लिए उपयोग करें jQuery, आदि ।
खुद स्कॉटगू के उद्धरण: Microsoft Ajax CDN आपको ASP.NET वेब फॉर्म और ASP.NET MVC अनुप्रयोगों के प्रदर्शन को बेहतर बनाने में सक्षम बनाता है जो ASP.NET AJAX या jQuery का उपयोग करते हैं। यह सेवा मुफ्त में उपलब्ध है, इसके लिए किसी पंजीकरण की आवश्यकता नहीं है, और इसका उपयोग वाणिज्यिक और गैर-वाणिज्यिक दोनों उद्देश्यों के लिए किया जा सकता है।
हम यहां तक कि jQuery का उपयोग करने वाले मॉस में अपने वेबपार्ट के लिए CDN का उपयोग करते हैं।
यदि आप NHibernate का उपयोग करते हैं, तो आप प्रश्नों के लिए दूसरे स्तर के कैश को चालू और सेटअप कर सकते हैं और क्वेरीज़ स्कोप और टाइमआउट में जोड़ सकते हैं। और EF , L2S और NHibernate के लिए किक गधा प्रोफाइलर है - http://hibernatingrhinos.com/products/UberProf । यह आपके प्रश्नों को ट्यून करने में मदद करेगा।
मैं भी जोड़ूंगा:
स्प्राइट्स का उपयोग करें : स्प्राइट्स एक अनुरोध को कम करने के लिए एक बढ़िया चीज है। आप अपनी सभी छवियों को एक ही में मर्ज करते हैं और स्प्राइट के अच्छे हिस्से को पाने के लिए सीएसएस का उपयोग करते हैं। Microsoft इसे करने के लिए एक अच्छी लाइब्रेरी प्रदान करता है: स्प्राइट और छवि अनुकूलन पूर्वावलोकन 4 ।
कैश योर सर्वर ऑब्जेक्ट : यदि आपके पास कुछ संदर्भ सूचियाँ या डेटा हैं जो शायद ही कभी बदलेंगे, तो आप हर बार क्वेरी डेटाबेस के बजाय मेमोरी में कैश कर सकते हैं।
एंटिटी फ्रेमवर्क के बजाय ADO.NET का उपयोग करें : EF4 or EF5
विकास के समय को कम करने के लिए महान हैं, लेकिन यह अनुकूलन करने के लिए दर्दनाक होगा। एंटिटी फ्रेमवर्क की तुलना में संग्रहीत कार्यविधि को अनुकूलित करना अधिक सरल है । इसलिए आपको यथासंभव स्टोर प्रक्रियाओं का उपयोग करना चाहिए। Dapper बहुत अच्छे प्रदर्शन के साथ SQL को क्वेरी और मैप करने का एक सरल तरीका प्रदान करता है।
कैश पेज या आंशिक पृष्ठ : एमवीसी कुछ मापदंडों के अनुसार कैश पेज को कुछ आसान फ़िल्टर प्रदान करता है, इसलिए इसका उपयोग करें।
डेटाबेस कॉल को कम करें : आप एक अद्वितीय डेटाबेस अनुरोध बना सकते हैं जो कई वस्तुओं को लौटाता है। Dapper वेबसाइट पर चेक करें।
हमेशा एक साफ-सुथरा आर्किटेक्चर होना चाहिए : एक छोटे प्रोजेक्ट पर भी एक साफ-सुथरा एन-टियर आर्किटेक्चर रखें। यह आपको अपना कोड साफ रखने में मदद करेगा, और ज़रूरत पड़ने पर इसे अनुकूलित करना आसान होगा।
आप इस टेम्पलेट " नियोस-एसडीसी एमवीसी टेम्प्लेट " पर एक नज़र डाल सकते हैं जो डिफ़ॉल्ट रूप से बहुत सारे प्रदर्शन सुधारों के साथ आपके लिए एक स्वच्छ वास्तुकला बनाएगा (चेक MvcTemplate वेबसाइट की जाँच करें)।
एक सुपर आसान बात यह है कि जब आप पेज के लिए डेटा चाहते हैं, तो एक्सेस करते समय अतुल्यकालिक रूप से सोचें। चाहे वेब सेवा, फ़ाइल, डेटा बेस या किसी अन्य चीज़ से पढ़ना हो, जितना संभव हो सके एस्किंस मॉडल का उपयोग करें। हालांकि यह जरूरी नहीं कि किसी भी एक पृष्ठ को तेजी से बनाने में मदद करेगा, यह आपके सर्वर को बेहतर प्रदर्शन करने में मदद करेगा।
1: समय प्राप्त करें। जब तक आप जानते हैं कि मंदी कहां है, सवाल का जवाब देने के लिए बहुत व्यापक है। मैं जिस प्रोजेक्ट पर काम कर रहा हूं, उसमें यह सटीक समस्या है; यह भी पता नहीं है कि कुछ खास चीजों में कितना समय लगता है; जब तक हम प्रोजेक्ट में समय नहीं जोड़ते, हम केवल ऐप के धीमे भागों के रूप में अनुमान लगा सकते हैं।
2: यदि आपके पास अनुक्रमिक संचालन हैं, तो हल्के से गुणा करने से डरो मत। ESPECIALLY अगर अवरुद्ध संचालन शामिल हैं। PLINQ यहां आपका मित्र है।
3: प्रकाशन के समय अपने MVC के दृश्यों को पूर्ववत करें ... जो 'पहले पृष्ठ हिट' में से कुछ के साथ मदद करेगा
4: गति के संग्रहित प्रक्रिया / ADO लाभ के लिए कुछ तर्क देते हैं। अन्य लोग ईएफ के विकास की गति के लिए तर्क देते हैं और टियर और उनके उद्देश्य के एक अधिक स्पष्ट seprataion हैं। मैंने एसक्यूएल और वर्कअराउंड को डेटा पुनर्प्राप्ति और भंडारण के लिए स्पार्क्स / व्यू का उपयोग करने के लिए वास्तव में धीमी डिजाइन देखा है। साथ ही, आपकी परीक्षा में कठिनाई होती है। हमारा वर्तमान कोडबेस जिसे हम ADO से EF में परिवर्तित कर रहे हैं, पुराने हैंड-रोलेड मॉडल की तुलना में कोई भी खराब (और कुछ मामलों में बेहतर) प्रदर्शन नहीं कर रहा है।
5: यह कहा, अनुप्रयोग वार्मअप के बारे में सोचो। हमारे ईएफ प्रदर्शन में से अधिकांश को खत्म करने में मदद करने के लिए हम जो भी करते हैं उसका एक विशेष वार्मअप तरीका जोड़ना था। यह किसी भी प्रश्न या किसी भी चीज़ को पहले से निर्धारित नहीं करता है, लेकिन यह मेटाडेटा लोड करने / उत्पन्न करने में बहुत मदद करता है। कोड प्रथम मॉडल के साथ काम करते समय यह और भी महत्वपूर्ण हो सकता है।
6: जैसा कि दूसरों ने कहा है, यदि संभव हो तो सत्र राज्य या ViewState का उपयोग न करें। वे आवश्यक रूप से प्रदर्शन अनुकूलन नहीं हैं जो डेवलपर्स के बारे में सोचते हैं, लेकिन एक बार जब आप अधिक जटिल वेब एप्लिकेशन लिखना शुरू करते हैं, तो आप जवाबदेही चाहते हैं। सत्र राज्य इसे पहले ही निकाल देता है। एक लंबी चलने वाली क्वेरी की कल्पना करें। आप एक नई विंडो खोलने का निर्णय लेते हैं और एक कम जटिल प्रयास करते हैं। ठीक है, आपने सत्र की स्थिति के साथ इंतजार किया होगा, क्योंकि सर्वर उस सत्र के लिए अगले एक पर जाने से पहले पहला अनुरोध किए जाने तक इंतजार करेगा।
7: डेटाबेस के लिए दौर यात्राओं को कम से कम। उन सामानों को बचाएं जिनका आप अक्सर उपयोग करते हैं लेकिन वास्तविक रूप से आपके .Net कैश में नहीं बदलेंगे। जहाँ संभव हो अपने आवेषण / अपडेट को बैचने का प्रयास करें।
7.1: बिना किसी अच्छे कारण के अपने रेज़र व्यू में डेटा एक्सेस कोड से बचें। मैं यह नहीं कह रहा होता अगर मैं इसे नहीं देखता। मॉडल को एक साथ रखने पर वे पहले से ही अपना डेटा एक्सेस कर रहे थे, आखिर वे मॉडल में शामिल क्यों नहीं थे?
बस मेरे 2 सेंट जोड़ना चाहता था। MVC एप्लिकेशन में URL रूट जेनरेशन को ऑप्टिमाइज़ करने के लिए सबसे प्रभावी तरीका है ... उन्हें उत्पन्न नहीं करना।
हम में से अधिकांश कम या ज्यादा जानते हैं कि हमारे ऐप्स में वैसे भी URL कैसे उत्पन्न होते हैं, इसलिए बस स्थैतिक का उपयोग करें Url.Content("~/Blahblah")
के बजाय Url.Action()
या Url.RouteUrl()
, जहां संभव लगभग 20 गुना की अन्य सभी तरीकों धड़कता है और उससे भी ज्यादा।
पुनश्च। मैंने कुछ हज़ार पुनरावृत्तियों के एक बेंचमार्क को चलाया है और यदि रुचि है तो अपने ब्लॉग पर परिणाम पोस्ट किए हैं ।
क्लाइंट पक्ष को अनुकूलित करने के लिए आपके कोलाहल में, डेटाबेस परत के बारे में मत भूलना। हमारे पास एक ऐसा एप्लिकेशन था जो 5 सेकंड से लेकर रात भर 50 सेकंड तक लोड रहता था।
निरीक्षण करने पर, हमने स्कीमा परिवर्तन का एक पूरा गुच्छा बनाया। एक बार जब हम आँकड़ों को ताज़ा करते हैं, तो यह अचानक पहले की तरह संवेदनशील हो जाता है।
निम्नलिखित बातें करने के लिए कर रहे हैं
यदि आप Microsoft ASPure (IaaS या PaaS) पर अपना ASP.NET MVC एप्लिकेशन चला रहे हैं, तो पहली तैनाती से पहले कम से कम निम्नलिखित करें।
मैंने उपरोक्त सभी उत्तर दिए और यह सिर्फ मेरी समस्या का समाधान नहीं था।
अंत में, मैंने प्रकाशित प्रोफ़ाइल में PrecompileBeforePublish को सही करने के लिए अपनी धीमी साइट लोडिंग समस्या को हल किया । यदि आप msbuild का उपयोग करना चाहते हैं तो आप इस तर्क का उपयोग कर सकते हैं:
/p:PrecompileBeforePublish=true
यह वास्तव में बहुत मदद करता है। अब मेरा MVC ASP.NET 10 गुना तेज लोड करता है।