2010-05-10 34 views
64

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

लेकिन मुझे एक भय है। मैं वास्तविक उत्पादन कोड में System.Diagnostics से कुछ भी उपयोग करने के बारे में परेशान हूँ। (मैं इसे आर्टर्ट्स और प्रिंटलन्स इत्यादि के साथ डिबगिंग के लिए बड़े पैमाने पर उपयोग करता हूं, लेकिन अभी तक उत्पादन सामग्री के लिए नहीं।) मैं केवल अपने कार्यों को बेंचमार्क करने के लिए टाइमर का उपयोग करने की कोशिश नहीं कर रहा हूं - मेरे ऐप को एक वास्तविक टाइमर चाहिए। मैंने एक और मंच पर पढ़ा है कि System.Diagnostics.StopWatch केवल बेंचमार्किंग के लिए है, और खुदरा कोड में उपयोग नहीं किया जाना चाहिए, हालांकि कोई कारण नहीं था। क्या यह सही है, या मैं हूं (और जो कोई भी सलाह पोस्ट करता है) सिस्टम के बारे में बहुत बंद हो रहा है। डायग्नोस्टिक्स? यानी, क्या उत्पादन कोड में System.Diagnostics.Stopwatch का उपयोग करना ठीक है? धन्यवाद एड्रियन

+0

आपको किस प्रकार की टाइमर चाहिए? क्या आप कुछ समय बीतने के बाद कुछ विधि शुरू करने की इच्छा रखते हैं, या क्या आपको यह जानने की जरूरत है कि अब तक कितना समय बीत चुका है? आपको किस परिशुद्धता की आवश्यकता है? – mnemosyn

+1

संभावित डुप्लिकेट [सी # में वास्तविक समय घड़ी कैसे प्राप्त करें?] (Http://stackoverflow.com/questions/2800559/how-to-get-a-real-time-clock-in-c)। मैं नहीं देखता कि यह दूसरे प्रश्न से अलग कैसे है। हो सकता है कि अगर आप इसे बदल दें, "क्या उत्पादन में सिस्टम। डायग्नोस्टिक्स कक्षाओं का उपयोग करने में कोई समस्या है, लेकिन अब यह एक डुप्लिकेट है"। –

+1

@ जॉन - आईएमओ, निश्चित रूप से एक डुप्लिकेट नहीं है। दूसरा सवाल पूछता है कि इसे कैसे करें; यह सवाल पूछता है कि क्या करना ठीक है। अन्य ओपी में स्टॉपवॉच से बचने के लिए कुछ अजीब कारण हो सकता है (उदाहरण के लिए पागल कॉर्पोरेट बीएस नियम जो अभी तक कोई समझ नहीं लेते हैं, अभी भी पालन नहीं किया जाना चाहिए .. नहीं, मैं कड़वा नहीं हूं!) – dss539

उत्तर

51

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

+2

हम उत्पादन कोड में हर समय QueryPerformanceCounter का उपयोग करें। प्रोड में इस बुनियादी ढांचे का उपयोग करना पूरी तरह से उचित है। –

4

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

+7

विस्तार से, यदि आप 'int' के बारे में पागलपन महसूस करते हैं तो अपना खुद का लिखें ... – Gusdor

3

स्टॉपवॉच basically a neat wrapper देशी QueryPerformanceCounter और QueryPerformanceFrequency विधियों के आसपास basically a neat wrapper है। यदि आप System.Diagnostic नामस्थान का उपयोग करके सहज महसूस नहीं करते हैं, तो आप access these directly कर सकते हैं।

प्रदर्शन काउंटर का उपयोग करना बहुत आम है, इसमें कुछ भी गलत नहीं है। AFAIK, कोई उच्च टाइमर परिशुद्धता उपलब्ध नहीं है। ध्यान दें कि क्यूपीएफ मल्टी प्रोसेसर मशीनों के साथ समस्याओं का कारण बन सकता है, लेकिन पहले से जुड़े एमएसडीएन आलेख उस पर कुछ अतिरिक्त जानकारी देता है। यह सुनिश्चित करने के लिए सलाह दी जाती है कि System.Diagnostics.Stopwatch पृष्ठभूमि में या SetThreadAffinity मैन्युअल रूप से कॉल करने के लिए है - अन्यथा आपका टाइमर समय पर वापस कूद सकता है!

ध्यान दें कि बहुत उच्च परिशुद्धता माप के लिए, some subtleties हैं जिन्हें ध्यान में रखना आवश्यक है। यदि आपको इस परिशुद्धता की आवश्यकता है, तो ये कुछ चिंता का विषय हो सकता है।

3

.NET बेस क्लास लाइब्रेरी में कई अलग-अलग टाइमर कक्षाएं हैं - जो आपकी आवश्यकताओं के लिए सबसे उपयुक्त है केवल आपके द्वारा निर्धारित की जा सकती है।

Here is a good article from MSDN magazine on the subject (Comparing the Timer Classes in the .NET Framework Class Library).

5

आप कहते हैं कि आप एक और मंच उत्पादन में System.Diagnostics से कक्षाओं का उपयोग नहीं करने पर पढ़ा है। लेकिन माइक्रोसॉफ्ट के बारे में चिंता करने वाला एकमात्र स्रोत है, जिसने कोड बनाया है। वे कहते हैं कि StopWatch class:

तरीकों और गुण है कि आप सही रूप में बीता हुआ समय को मापने के लिए उपयोग कर सकते हैं का एक सेट प्रदान करता है।

वे कहते हैं, "उत्पादन में छोड़कर"।

+5

मुझे लगता है कि निहितार्थ यह था कि यह महंगा हो सकता है ... – Tim

0

आप जिस टाइमर का उपयोग कर रहे हैं उसके आधार पर, आपको अन्य मुद्दों पर विचार करने के लिए अन्य समस्याएं हो सकती हैं। विंडोज निष्पादन के समय पर गारंटी प्रदान नहीं करता है, इसलिए आपको किसी भी वास्तविक समय प्रसंस्करण के लिए उस पर भरोसा नहीं करना चाहिए (वास्तविक समय-समय पर एक्सटेंशन जो आप Windows के लिए प्राप्त कर सकते हैं जो हार्ड रीयल-टाइम शेड्यूलिंग प्रदान करते हैं)।मुझे यह भी संदेह है कि आप समय अंतराल पर कब्जा करने के बाद संदर्भ स्विचिंग के परिणामस्वरूप सटीकता खो सकते हैं और इससे पहले कि आप इसके साथ कुछ करें जो इसकी सटीकता पर निर्भर करता है। सिद्धांत रूप में, यह एक मनमाने ढंग से लंबे समय तक हो सकता है; अभ्यास में यह मिलीसेकंड के क्रम पर होना चाहिए। यह वास्तव में इस बात पर निर्भर करता है कि इस समय मिशन-महत्वपूर्ण कैसे है।

21

हां, System.Diagnostics ऐसा लगता है जैसे यह केवल डीबगिंग के लिए है, लेकिन नाम को आपको धोखा देने दें। System.Diagnostics नेमस्पेस पहले उत्पादन कोड में उपयोग के लिए थोड़ा डरावना लग रहा है (यह मेरे लिए किया गया था), लेकिन उस नामस्थान में बहुत उपयोगी चीजें हैं।

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

अन्य चीजें, जैसे कि Trace कक्षा, उत्पादन कोड में बग को ट्रैक करने में आपकी सहायता कर सकती हैं। अनुमोदित, आप हमेशा उत्पादन कोड में उनका उपयोग नहीं करेंगे, लेकिन वे बहुत रिमोट मशीन पर उस छिपी हुई बग को लॉगिंग और ट्रैकिंग के लिए उपयोगी हैं।

नाम के बारे में चिंता न करें।

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