2013-03-13 10 views
9

के साथ किसी विधि के लिए समय बीतने के लिए समय की गणना कैसे करें मैं किसी भी प्रकार (किसी भी प्रकार से) किसी भी विधि के लिए निष्पादित समय को मापने के उद्देश्य से एक बहुत ही सरल उपयोगिता वर्ग लिख रहा हूं।उपयोगिता वर्ग

मेरे मामले में Membership.ValidateUser(model.UserName, model.Password) वापसी बूल तो मुझे अपवाद मिलता है।

मैं चाहूंगा कि इस प्रकार की उपयोगिता वर्ग को ठीक करने के तरीके पर कोड का एक नमूना लिखना संभव होगा। क्या यह कार्रवाई की स्थिति में गतिशील गति का उपयोग करता है?

Tracing.Log(Membership.ValidateUser(model.UserName, model.Password), "Membership.ValidateUser"); 

public static class Tracing 
     { 
      public static void Log(Action action, string message) 
      { 
       // Default details for the Log 
       string sSource = "TRACE"; 
       string sLog = "Application"; 

       // Create the Log 
       if (!EventLog.SourceExists(sSource)) 
        EventLog.CreateEventSource(sSource, sLog); 

       // Measure time Elapsed for an Action 
       Stopwatch stopwatch = Stopwatch.StartNew(); 
       action(); 
       stopwatch.Stop(); 
       TimeSpan timeElapsed = stopwatch.Elapsed; 

       // Write the Log 
       EventLog.WriteEntry(sSource, "TIME-ELAPSED: " + timeElapsed .ToString() + message, EventLogEntryType.Warning, 234); 
      } 
     } 

उत्तर

8

आपके मौजूदा कोड ValidateUser निष्पादित और विधि तर्क के रूप में परिणाम उपयोग करने के लिए कोशिश करता है। आप बिना किसी के पहले ValidateUser निष्पादित करना चाहते हैं।

तुम बस एक प्रतिनिधि बनाने के लिए एक लैम्ब्डा अभिव्यक्ति का उपयोग करने के लिए अपने विधि कॉल बदलने की आवश्यकता: (। गतिशील टाइपिंग इस सब पर कोई असर नहीं पड़ेगा)

Tracing.Log(() => Membership.ValidateUser(model.UserName, model.Password), 
      "Membership.ValidateUser"); 

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

संपादित करें: मुझे लगता है कि आप इसका उपयोग बेंचमार्किंग के लिए पूरी तरह से करना चाहते हैं। यदि आप अपने असली एप्लिकेशन में यह ट्रेसिंग करने की कोशिश कर रहे हैं, तो आप कम आक्रामक दृष्टिकोण चाहते हैं। उदाहरण के लिए Mini-MVC-Profiler देखें।

+0

मैं आपकी व्याख्या के लिए धन्यवाद देना चाहता हूं। मेरी कक्षा को फिर से लिखना और प्रयोगशाला का उपयोग कैसे किया जा सकता है? आपके समय के लिए धन्यवाद – GibboK

+0

@ गिबोक: मुझे नहीं पता कि आपका क्या मतलब है। मैंने आपको दिखाया है कि आप विधि को कैसे कॉल कर सकते हैं। –

+0

धन्यवाद जॉन, मुझे एमवीसी-प्रोफाइलर से अवगत नहीं था। – GibboK

0

कोई अपराध इरादा नहीं है, लेकिन आपका डिज़ाइन दृष्टिकोण मेरे पीछे आता है। मुझे लगता है कि आपके व्यावसायिक लक्ष्यों को समय कोड कोड संचालन से उपयोगकर्ता को मान्य करने के बारे में अधिक जानकारी है। यदि यह गलत है, तो मुझे अनदेखा करें। :)

यदि मैं आप थे, तो मैं दूसरी तरफ के बजाय आपके सत्यापन में एक समय/ट्रेसिंग कक्षा इंजेक्ट करता। आप निर्भरता इंजेक्शन का उपयोग किसी भी तरीके से (ढांचे या साधारण कन्स्ट्रक्टर इंजेक्शन में से एक) में कर सकते हैं, और इसे प्रदान किए जाने पर समय करने के लिए इसका इस्तेमाल कर सकते हैं।

HTH

+1

जबकि लाइव ट्रैफिक के साथ ट्रेस करना ठीक है, यह * बेंचमार्किंग के लिए पूरी तरह से एक विधि का उपयोग करने में सक्षम होने के लिए भी उपयोगी है। –

+0

हां मुझे बस लाइव ट्रैफिक का पता लगाने के लिए एक त्वरित तरीका चाहिए – GibboK

+0

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

0

आप विधि है कि मापा जाता है संशोधित कर सकते हैं, तो आप एक वर्ग है कि टाइमर शुरू कर देंगे यह रचना है पर लागू कर सकते हैं, और निपटान पर इसे रोकने के।

using(var tm = new TimeMeasurementThreshold(TimeSpan.FromSeconds(1),"Sending mail block",logger)){ 
// measured code here 
} 

public class TimeMeasurementThreshold : IDisposable 
    { 
     private readonly Logger logger; 

     private readonly TimeSpan thresholdTime; 

     private readonly string codeBlockName; 

     private readonly TimeMeasurement timeMeasurement; 

     public TimeMeasurementThreshold(TimeSpan thresholdTime, string codeBlockName, Logger logger) 
     { 
      this.logger = logger; 
      this.thresholdTime = thresholdTime; 
      this.codeBlockName = codeBlockName; 

      timeMeasurement = new TimeMeasurement(); 
     } 

     public void Dispose() 
     { 
      TimeSpan elapsed = timeMeasurement.Elapsed; 

      if (elapsed >= thresholdTime) 
      { 
       logger.Debug("{0} execution time is {1:N0}ms", codeBlockName, elapsed.TotalMilliseconds); 
      } 
     } 
    } 
0

आप आसानी से एक लैम्ब्डा है कि आप किसी अन्य विधि के पास एक कार्रवाई का परिणाम आवंटित करने के लिए, के लिए उपयोग कर सकते हैं: और, अगर कुछ सीमा से अधिक है, यह

प्रयोग किया जाएगा एक लॉग संदेश पैदा करेगा उदाहरण:

using System; 

namespace Demo 
{ 
    public static class Program 
    { 
     private static void Main(string[] args) 
     { 
      bool result = false; 

      Tracing.Log(() => 
      { 
       result = test(""); // Assign to result. 
      }, "Message"); 

      Console.WriteLine(result); 
     } 

     private static bool test(string value) 
     { 
      return string.IsNullOrEmpty(value); 
     } 
    } 

    public static class Tracing 
    { 
     public static void Log(Action action, string message) 
     { 
      action(); 
      Console.WriteLine(message); 
     } 
    } 
} 
संबंधित मुद्दे