2011-04-28 17 views
10

के प्रदर्शन को मापने के लिए मैंने एएसपी.नेट एमवीसी 3 में एक JSON सेवा बनाई है और मैं अपने आवेदन में क्रियाओं के निष्पादन समय को मापने में सक्षम होना चाहता हूं (मैं इसे स्वचालित रूप से धीमा लॉग करना चाहता हूं कार्रवाई)।एएसपी.नेट एमवीसी 3

इसके लिए यह बहुत अच्छा लग रहा था; http://coderjournal.com/2010/10/timing-the-execution-time-of-your-mvc-actions/ (यहां स्टैक ओवरफ़्लो पर भी स्थानों पर इसका उल्लेख किया गया है)

समस्या यह है कि मुझे माप मिलता है जो इस विधि से गलत होना चाहिए; मैंने एक और स्टॉपवॉच जोड़ा है जो कार्रवाई में पहली चीज़ शुरू करता है और वापसी से ठीक पहले बंद हो जाता है।

उदाहरण:

  • विधि के अंदर स्टॉपवॉच =>10ms (json को serializing यहाँ छोड़ दिया जाता है, तो मैं समझ सकता हूँ कि यह वास्तविकता की तुलना में कम है)
  • स्टॉपवॉच विशेषता (कोड ऊपर) = >676ms
  • फ़ायरफ़ॉक्स का कहना है कि अनुरोध = = 70ms लिया गया।

मेरा मानना ​​है कि फ़ायरफ़ॉक्स में सही समय है (लेकिन इसमें डाउनलोड शामिल है, इसलिए यह थोड़ा बड़ा है), लेकिन मैं समझना चाहता हूं कि विशेषता कोड क्यों काम नहीं करता है, इसके लिए कोई विचार?

+0

हाँ, और कैश फ़ायरफ़ॉक्स में बंद है ... – ullmark

उत्तर

16

यह कारण नहीं हो सकता है कि यह लंबे निष्पादन समय को दिखाता है, लेकिन यह विशेषता एमवीसी 3 के साथ सही ढंग से काम नहीं करेगी जब आपके पास एक से अधिक अनुरोध हों।

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

मैं OnActionExecuting और save it to HttpContext.Current.Items में नए स्टॉपवॉच का दृष्टांत को सलाह देते हैं - तो आप OnActionExecuted में इसे पुनः प्राप्त करने और परिणाम प्रिंट कर सकते हैं।

+0

आप सही थे, के बाद से कार्यों कैश नहीं किया जाता, निर्माता केवल एक बार ही सही, इसलिए एक ही स्टॉपवॉच पुन: उपयोग किया जाता है चलाया जाता है। – ullmark

+0

शानदार दृष्टिकोण! – Ricky

+1

प्रश्न में कोड [अद्यतन किया गया है] (https://github.com/managedfusion/managedfusion-web/blob/master/src/Web/Mvc/StopwatchAttribute.cs) और अब Lukas Novotný के रूप में काम करता है। –

0

ऐसा लगता है कि आप परिमाण के क्रम से बंद हैं। क्या आप वाकई परिणाम सही तरीके से पढ़ रहे हैं? Stopwatch.ElapsedMilliseconds संपत्ति का उपयोग करने का प्रयास करें।

8

https://stackoverflow.com/a/5823555/504082 का उत्तर देने के अलावा अधिक सही दृष्टिकोण घड़ी निष्पादन के अंत में OnResultExecuted ओवरराइड का उपयोग करना है। जब आप लौट

ActionResponse.Success(arr.Select(x => func(x)).ToJson(); 

यानी अपनी कार्रवाई का एक परिणाम के रूप में कुछ आलसी LINQ बयान, यह गणना की जाएगी के बाद कार्रवाई "मार डाला" है (समारोह 'समारोह की सजा को कार्रवाई निष्पादन समय की गणना में शामिल नहीं किया जाएगा) । मुझे यह गंदा बग मिला है और यह पता नहीं लगा सका कि मेरी कार्रवाई "निष्पादन समय" 100 एमएस क्यों है हालांकि वेब अनुरोध 10 सेकंड निष्पादित करता है। नीचे संशोधित कोड।

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace SW 
{ 
    public class StopwatchAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      var stopwatch = new Stopwatch(); 
      filterContext.HttpContext.Items["Stopwatch"] = stopwatch; 

      stopwatch.Start(); 
     } 

     public override void OnResultExecuted(ResultExecutedContext filterContext) 
     { 
      var stopwatch = (Stopwatch)filterContext.HttpContext.Items["Stopwatch"]; 
      stopwatch.Stop(); 

      var httpContext = filterContext.HttpContext; 
      var response = httpContext.Response; 

      response.AddHeader("X-Runtime", stopwatch.Elapsed.TotalMilliseconds.ToString()); 
     } 
    } 
} 
+0

एर्ममार्ड को कॉल कर सकता है, यह शानदार है। क्या आपको पता है कि इसे 'ActionFilterAttribute' से अलग करना संभव है ताकि इसका उपयोग किसी भी विधि के लिए किया जा सके? मैंने सोचा कि मैं विशेषता के लिए एक नाम संपत्ति डाल सकता हूं ताकि विभिन्न स्टॉपवॉच का ट्रैक रखा जा सके या लॉग इन कर सकें और EndRequest पर इसे मार डालें, लेकिन मैं यह नहीं समझ सकता कि गैर-क्रियाओं के लिए "ऑनरसेल एक्सटेक्टेड" ईवेंट को कैसे पकड़ना है। – Nenotlep

+0

यदि आप वेबपृष्ठ में "डीबग" कंसोल चाहते हैं तो यह बहुत अच्छा है –

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