2010-09-07 3 views
5

मैं क्या मतलब है ...क्या यह सी # में कुछ कोड चलाने के लिए कितने समय लगेगा, यह जांचने का एक अच्छा तरीका है?

समय मिलता है, कोड चलाने के लिए, समय मिलता है, समय की तुलना करने और बाहर सेकंड मिलती है:

मैं यह सही कर रहा हूँ?

DateTime timestamp = DateTime.Now; 
//...do the code... 
DateTime endstamp = DateTime.Now; 

string results = ((endstamp.ticks - timestamp.ticks)/10000000).ToString(); 
+0

इस के लिए सर्वश्रेष्ठ उपकरण Redgate प्रोफाइलर या एक है कि दृश्य स्टूडियो के संस्करणों में से एक के साथ आता है की तरह वास्तविक प्रोफ़ाइल उपकरण हैं। इसकी कमी के लिए, एंथनी ने कहा कि आपकी सबसे अच्छी शर्त –

+1

@ जॉर्ज - बड़े परिचालनों के लिए या देखे जाने का समय कहां सही हो सकता है, लेकिन शॉर्ट कोड स्निपेट के लिए, उदाहरण के लिए 10,000 बार कुछ करने का सबसे तेज़ तरीका क्या है ... प्रोफाइलर सक्रिय रूप से हस्तक्षेप करते हैं और शायद सटीक परिणाम प्राप्त करने के लिए सबसे अच्छा तरीका नहीं हैं। –

+0

पर्याप्त उचित, अच्छा बिंदु। –

उत्तर

6

System.Diagnostics.Stopwatch वर्ग के बजाय नंबर का प्रयोग करें। DateTime.Now में आपके इच्छित परिशुद्धता का स्तर नहीं है (हालांकि DateTime संरचना बहुत सटीक है, और स्वयं में)।

Stopwatch watch = new Stopwatch(); 
watch.Start(); 
// do stuff 
watch.Stop(); 
long ticks = watch.ElapsedTicks; 
+0

कोई कार्यान्वयन नमूना? – BigOmega

+0

@Ryan, नमूना जोड़ा गया। –

+4

वास्तव में, डेटटाइम में * सटीक * है लेकिन इसमें सटीकता * का एक समान स्तर नहीं है। उस पर कुछ विचारों के लिए http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx देखें। –

13

उदाहरण के लिए आप इस के लिए Stopwatch का उपयोग करना चाहिए,:

var sw = Stopwatch.StartNew(); 
//...do the code... 
sw.Stop(); 
var result = sw.ElapsedTicks; //ticks it took 
//or less accurate/for bigger tasks, sw.ElapsedMilliseconds 

संपादित शामिल करने के लिए @ टिप्पणियों से Brian के सुधार।

+5

+1। एक शॉर्टकट है: 'var sw = stopwatch.StartNew();' जो पहले दो पंक्तियों को एक साथ लाता है। इसके अलावा, जब तक कि इसमें कोई समय नहीं लगता है, मैं 'sw.ElapsedMilliseconds' पसंद करता हूं क्योंकि इसका मतलब है कि टिकों की तुलना में मेरे लिए अधिक है। –

+0

@ ब्रायन - मैंने इस 1000 बार उपयोग किया है और * कभी * ध्यान नहीं दिया '। टार्टन्यू() ', सर से दूर हैट्स। –

+0

स्टॉपवॉच को भी [जेम्स माइकल] द्वारा अच्छी तरह से ब्लॉग किया गया था (http://geekswithblogs.net/BlackRabbitCoder/archive/2010/08/26/c.net-five-little-wonders-that-make-code-better-1 -of.aspx) और [स्कॉटगू] द्वारा प्रचारित (http://weblogs.asp.net/scottgu/archive/2010/08/29/august-29th-links-net-asp-net-iis-express-silverlight- विंडोज़-फोन-7.aspx) कुछ हफ्ते पहले – slugster

0

यह शायद ठीक है का उपयोग करने के, लेकिन ध्यान दें "समय की राशि यह कुछ कोड को चलाने के लिए ले लिया" के लिए कई साधन देखते हैं कि है। दीवार घड़ी का समय आपके पास है: पहली और दूसरी कॉल के बीच दुनिया में पारित समय की संख्या DateTime.Now (लगभग) तक है। इसमें ताले या डिस्क का उपयोग करने में व्यतीत समय, अन्य थ्रेड चलाने वाले समय शामिल होंगे, जिसमें आपका कोड नहीं है, आदि

1

स्पष्ट रूप से आपकी मशीन पर निष्पादित आर्बेटरी प्रक्रियाएं आपको मिलने वाले परिणाम को विकृत कर देगी।
एक स्टॉपवॉच एक अच्छा समाधान है, जैसा कि एमएसडीएन में बताया गया है:

स्टॉपवॉच उपायों अंतर्निहित टाइमर तंत्र में टाइमर टिकों की गणना करके समय बीत चुका है। यदि स्थापित हार्डवेयर और ऑपरेटिंग सिस्टम उच्च-रिज़ॉल्यूशन प्रदर्शन काउंटर का समर्थन करता है, तो स्टॉपवॉच क्लास उस काउंटर का उपयोग विलुप्त समय को मापने के लिए करती है। अन्यथा, स्टॉपवॉच कक्षा विलुप्त समय को मापने के लिए सिस्टम टाइमर का उपयोग करती है। स्टॉपवॉच समय कार्यान्वयन की सटीकता और संकल्प निर्धारित करने के लिए आवृत्ति और IsHighResolution फ़ील्ड का उपयोग करें।

स्टॉपवॉच कक्षा प्रबंधित कोड के भीतर समय-संबंधित प्रदर्शन काउंटरों में हेरफेर करने में सहायता करती है। विशेष रूप से, फ्रीक्वेंसी फ़ील्ड और GetTimestamp विधि का उपयोग अप्रबंधित Win32 APIs QueryPerformanceFrequency और QueryPerformanceCounter के स्थान पर किया जा सकता है।

0

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

Here is an article उस पर।

11

जैसा कि कई लोगों ने ध्यान दिया है, उच्च परिशुद्धता स्टॉपवॉच क्लास को "यह कितना समय लगता है?" जबकि डेटटाइम क्लास को प्रश्न का जवाब देने के लिए डिज़ाइन किया गया है "डॉक्टर कौन शुरू करता है?" इस काम के लिए सही उपकरण का उपयोग करें।

हालांकि, टाइमर सही होने के बजाय सही समय को सही ढंग से मापने की समस्या के लिए और भी कुछ है। आपको यह भी सुनिश्चित करना होगा कि आप माप रहे हैं कि आप वास्तव में मापना चाहते हैं।उदाहरण के लिए, पर विचार करें:

// start the timer 
M(); 
// stop the timer 
// start another timer 
M(); 
// stop the timer 

वहाँ दो कॉल के समय के बीच एक महत्वपूर्ण अंतर होने जा रहा है? संभवतः हाँ। याद रखें, पहली बार एक विधि कहा जाता है घबराना मशीन कोड में आईएल से संकलित करने के लिए है। इसमें समय लगता है। एक पद्धति के लिए पहली कॉल कुछ मामलों बाद के हर एक साथ रखा कॉल की तुलना में कई गुना अब में हो सकता है।

तो जो माप "सही" है? पहला माप? दूसरा? उनमें से एक औसत? यह इस बात पर निर्भर करता है कि आप के लिए अनुकूलित करने का प्रयास कर रहे हैं। यदि आप तेज़ स्टार्टअप के लिए अनुकूलित कर रहे हैं तो आप जिट टाइम के बारे में बहुत अधिक परवाह करते हैं। आप अनुकूलित कर रहे हैं, तो के लिए समान पृष्ठों की संख्या एक गरम-अप सर्वर पर प्रति सेकंड की सेवा तो आप बिल्कुल JIT समय के बारे में परवाह नहीं है और करने के लिए अपने परीक्षण डिजाइन करने दिया जाना चाहिए यह उपाय नहीं। सुनिश्चित करें कि आप उस चीज़ को माप रहे हैं जिसके लिए आप वास्तव में अनुकूलित कर रहे हैं।

1

पिछले जवाब में दिए गए सुझाव सरल मापन के लिए काम करेंगे। यदि आपको कुछ और उन्नत की आवश्यकता है, तो आप एक प्रोफाइलर का उपयोग करना चाहेंगे (वाणिज्यिक हैं और equatec जैसे निःशुल्क हैं)।

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

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