2008-10-17 16 views
15

एएसपी.नेट एमवीसी के साथ एक छोटा बेंचमार्क। Viewpage कोड:एएसपी.नेट एमवीसी यूआरएल पीढ़ी प्रदर्शन

public string Bechmark(Func<string> url) 
    { 
     var s = new Stopwatch(); 
     var n = 1000; 

     s.Reset(); 
     s.Start(); 
     for (int i = 0; i < n; i++) 
     { 
      var u = url(); 
     } 
     s.Stop(); 
     return s.ElapsedMilliseconds + " ms, " + ((s.ElapsedMilliseconds)/(float)n) + " ms per link<br/>"; 
    } 

देखें कोड:

38:

<%= Bechmark(() => Url.Action("Login", "Account")) %> 

<%= Bechmark(() => Url.Action("Login", "Account", new {username="bla", password="bla2", returnurl="blabla32", rememberme=false})) %> 

<%= Bechmark(() => Html.BuildUrlFromExpression<AccountController>(a=>a.ChangePassword("bla", "bla", "ya"))) %> 

ASP.NET MVC बीटा के साथ डिफ़ॉल्ट नई परियोजना टेम्पलेट पर एक ठेठ Core2 नोटबुक पर यह चल रहा है इन परिणाम प्राप्त होते हैं एमएस, 0,038 एमएस प्रति लिंक

120 एमएस, 0,12 एमएस प्रति लिंक

54 एमएस, लिंक

के बारे में 10 नियंत्रकों है कि चारों ओर 100 के तरीकों और 30 रूटिंग तालिका प्रविष्टियों में सभी के साथ एक उत्पादन परियोजना पर एक ही बेंचमार्क चल रहा है प्रति 0054 एमएस, प्रदर्शन के लिए अभिव्यक्ति आधारित बहुत खराब हो विधि:

31 एमएस, लिंक प्रति 0031 एमएस

112 एमएस, लिंक प्रति 0112 एमएस

450 एमएस, लिंक

प्रति 0,45 एमएस

हम इस विधि का उपयोग बहुत अधिक (रखरखाव) करते हैं और कुछ प्रदर्शन बेंचमार्किंग करते हैं, इससे साइट के प्रदर्शन में काफी गिरावट आती है - पृष्ठों में जल्दी से लगभग 30 या अधिक लिंक होते हैं, जिसका अर्थ है कि एकल पर 10ms अतिरिक्त ओवरहेड पृष्ठ। एक यूआरएल प्रति 0.112ms भी शुद्ध CPU ओवरहेड के लगभग 4ms है।

यह ध्यान देने योग्य है कि MVC पूर्वावलोकन 3 और बीटा के बीच तीनों यूआरएल पीढ़ी कॉल (जारी की कल) के प्रदर्शन 5.

स्टैक ओवरफ़्लो का एक पहलू से सुधार किया गया माना जाता है कि एक ही ढांचे, कैसे द्वारा संचालित है क्या आपने लोगों ने इस स्केलिंग समस्या का सामना किया है? सामने वाले पृष्ठ के लिबरल कैशिंग (लिंक के बहुत सारे) और पूर्व-प्रस्तुत नियंत्रण?

प्रदर्शन समस्याओं या कुछ अच्छी युक्तियों के साथ एएसपी.नेट एमवीसी में कोई अन्य उत्पादन वेबसाइट?

+0

यहाँ आप उपयोगी लग सकते लिंक है: http://blog.whiletrue.com/2009/04/aspnet-mvc-performance/ – Nik

+0

@Nik: वास्तव में, मुझे लगता है कि प्रस्तुति के लेखक हूँ, इतनी अच्छी तरह से ... हाँ।:) – rudib

+0

क्या किसी को पता है कि यह अभी भी एएसपी.नेट एमवीसी 2 के साथ एक मुद्दा है? –

उत्तर

1

कैशिंग लिंक शायद टीम के लिए एक अच्छा सुझाव होगा, क्योंकि वे प्रक्रिया के जीवन के लिए नहीं बदलेंगे (वैसे भी अधिकांश ऐप्स के लिए)।

जब तक आप कॉन्फ़िगर करने योग्य फ़ॉर्म (जैसे web.config या डेटाबेस में) में अपने मार्गों को परिभाषित करना प्रारंभ नहीं करते हैं, तो आपको थोड़ा सा स्केल करना होगा।

मुझे संदेह है कि मध्य उदाहरण पर देरी का एक बड़ा हिस्सा अज्ञात प्रकार है जो स्वचालित रूप से एक शब्दकोश में परिवर्तित हो जाता है। यूआरएल को कैशिंग करने से यहां बी/सी की मदद नहीं होगी, आपको अभी भी उस प्रकार को प्रतिबिंबित करने की आवश्यकता होगी।

इस बीच, आप उन कुछ शब्दकोश-आधारित लिंक के लिए अपनी स्वयं की सहायक विधि बना सकते हैं जो आपको आवश्यक सटीक इनपुट लेते हैं। फिर आप खुद को कैशिंग को संभाल सकते हैं।

1

ठीक है, रिक्त टेम्पलेट परियोजना पर दो अतिरिक्त मीट्रिक:

<%= Bechmark(() => Url.Action("Login", "Account", new Dictionary<string, object> {{"username", "bla"}, {"password", "bla2"}, {"returnurl", "blabla32"}, {"rememberme", "false"}})) %> 

<%= Bechmark(() => Url.Action("Login", "Account", new RouteValueDictionary(new Dictionary<string, object> {{"username", "bla"}, {"password", "bla2"}, {"returnurl", "blabla32"}, {"rememberme", "false"}}))) %> 

परिणाम:

71 एमएस, लिंक प्रति 0071 एमएस

35 एमएस, लिंक

प्रति 0035 एमएस

नास्टियर कोड के साथ बेहतर प्रदर्शन। बहुत बुरा।

0

कैशिंग लिंक शायद, टीम के लिए एक अच्छा सुझाव होगा के रूप में वे करेंगे प्रक्रिया के जीवन के लिए परिवर्तन (अधिकांश ऐप्स के लिए वैसे भी) नहीं।

आप लिंक कैसे कैश कर सकते हैं, आप इसे तब तक नहीं कर सकते हैं, जहां तक ​​मुझे पता है, क्योंकि आपको निष्पादित होने वाली विधि को कैश करने की आवश्यकता है, जो रूट के हल होने के बाद होता है, जो धीमा हिस्सा है।

4

मैंने एमएस मंचों पर इस प्रश्न से पूछा, जिसे एमएस एमवीसी डेवलपर से जवाब मिला।

The post

जवाब

MVC पूर्वावलोकन 2 से हाल ही में जारी MVC बीटा कल से वहाँ रूटिंग में परिवर्तन का एक बहुत कुछ किया गया है। उनमें से कुछ परिवर्तनों में प्रदर्शन सुधार शामिल हैं। यूआरएल पीढ़ी को आपके आवेदन में अधिक प्रदर्शन करने के लिए यहां कुछ युक्तियां दी गई हैं:

  1. नामित मार्गों का उपयोग करें। नामित मार्ग रूटिंग की एक वैकल्पिक विशेषता है। नाम केवल यूआरएल पीढ़ी पर लागू होते हैं - इन्हें आने वाले यूआरएल से मेल खाने के लिए कभी भी उपयोग नहीं किया जाता है। जब आप यूआरएल उत्पन्न करते समय कोई नाम निर्दिष्ट करते हैं तो हम केवल उस मार्ग से मेल खाने का प्रयास करेंगे। इसका मतलब है कि भले ही आपके द्वारा निर्दिष्ट नामित मार्ग मार्ग तालिका में 100 वां मार्ग है, हम सीधे उस पर कूदेंगे और मिलान करने का प्रयास करेंगे।

  2. मार्ग तालिका की शुरुआत में अपने सबसे आम मार्ग रखें। यह यूआरएल पीढ़ी के साथ-साथ आने वाले यूआरएल को प्रोसेस करने के प्रदर्शन में सुधार करेगा। रूटिंग कार्य नियम के आधार पर काम करता है कि पहला मैच जीतता है। यदि पहला मैच आपकी रूट टेबल में 100 वां मार्ग है, तो इसका मतलब है कि इसे 99 अन्य मार्गों का प्रयास करना था और उनमें से कोई भी मेल नहीं खाता था।

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

मेरा पसंदीदा विकल्प # 1 है (है कि आप है!)।

+1

प्रश्न: नामित मार्गों का उपयोग करें <- नामित मार्ग क्या है? उपयोग करने के लिए अधिभार क्या है? चीयर्स :) –

+0

यदि आप अभी भी परवाह करते हैं: अपने ग्लोबल.एक्सएक्स में आप मार्गों का उपयोग करते हैं। मैपराउट ("रूटनाम", याडियायाडिया); फिर अपने कार्यों में आप एक RedirectToRoute ("रूटनाम", viewData) कर सकते हैं; शायद कहीं और कहीं है –

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