क्या मुझे स्टॉपवॉच को विधि के अंत में रोकना चाहिए?


89

चलो कल्पना करते हैं कि हमारे पास सरल माप का उपयोग है Stopwatch

public void DoWork()
{
    var timer = Stopwatch.StartNew();
    // some hard work
    Logger.Log("Time elapsed: {0}", timer.Elapsed);
    timer.Stop(); // Do I need to call this?
}

MSDN के अनुसार:

एक ठेठ स्टॉपवॉच परिदृश्य में, आप प्रारंभ विधि को कॉल करते हैं, फिर अंततः स्टॉप विधि को कॉल करते हैं , और फिर आप बीती हुई संपत्ति का उपयोग करते हुए बीते हुए समय की जांच करते हैं।

मुझे यकीन नहीं है कि मुझे इस विधि को कॉल करना चाहिए जब मुझे टाइमर उदाहरण के साथ दिलचस्पी नहीं है। क्या मुझे Stopविधि का उपयोग करके "खाली करना" चाहिए ?

संपादित करें

ध्यान रखें कि लकड़हारा. (..) लागत कुछ भी नहीं है क्योंकि लकड़हारा लॉग से पहलेtimer.Elapsed पढ़ा जाता है।


1
Stopलापरवाह गलतियों से विधि रोकता है आप, उदाहरण के लिए आप का मूल्यांकन कर रहे है, तो Elapsedसंपत्ति कई बार।
टिम श्मेल्टर

3
: स्रोत पर एक नजर डालें referencesource.microsoft.com/#System/services/monitoring/...
क्रिस Vandermotten

चूंकि टाइमर गुंजाइश से बाहर जा रहा है, आप क्यों मानते हैं कि कॉलिंग से Stopकोई फर्क पड़ेगा? आप वैसे भी मान का उपयोग नहीं कर सकते हैं
डिफ़ॉल्ट

जवाबों:


82

नहीं, आपको इसे रोकने की आवश्यकता नहीं है। Stop()बस बीता हुआ समय ट्रैक करना बंद कर देता है। यह किसी भी संसाधन को मुक्त नहीं करता है।


4
लेकिन लापरवाह गलतियों को रोकने के लिए वैसे भी इसका उपयोग करना अच्छा अभ्यास है।
टिम श्मेल्टर

13
यह कुछ भी नहीं रोकता है, वह स्टॉपवॉच विधि में बना रहा है और इसे वापस नहीं कर रहा है, इसलिए वह "बाद में गलतियाँ" करने के लिए इसे पकड़ नहीं पाएगा।
रोनन थिबुडौ

21
प्रारंभ () और स्टॉप () के बीच कॉल के बीच एक स्टॉपवॉच भी कोई काम नहीं कर रहा है या सीपीयू घड़ी चक्र नहीं खा रहा है। प्रारंभ () बस अब के लिए एक टाइमस्टैम्प सेट करता है और स्टॉप () की गणना करता है और उसके बाद से बीता हुआ समय बचाता है। Coreclr में स्रोत देखें: github.com/dotnet/corefx/blob/master/src/…
Sammi

42

नहीं, इसे रोकने या साफ करने की कोई जरूरत नहीं है।

Stopwatchकिसी भी मानव रहित संसाधनों का उपयोग नहीं करता है (यदि आपने सोचा था IDisposable)। यह वास्तव में किसी भी संसाधन का उपयोग नहीं करता है (केवल ऑब्जेक्ट द्वारा उपयोग की जाने वाली मेमोरी को छोड़कर, निश्चित रूप से)! यह बीते हुए समय को मापने के दौरान किसी भी सीपीयू का उपभोग नहीं करता है!

.NET (पूर्ण .NET फ्रेमवर्क, मोनो, .NET कोर) के विंडोज़ कार्यान्वयन में, यह एक उच्च रिज़ॉल्यूशन टाइम स्टैम्प को पुनः प्राप्त करने के लिए QueryPerformanceCounter()आवश्यक होने पर (आवश्यक होने पर Start()और Stop()पढ़ते समय Elapsed) बस विंडोज एपीआई को कॉल करता है ।

मोनो और .NET कोर के लिनक्स कार्यान्वयन में, यह clock_gettimeएक मोनोटोनिक बढ़ते समय मान को पुनः प्राप्त करने के लिए फ़ंक्शन का उपयोग करता है।

कार्यान्वयन विवरण के बारे में वास्तविक जिज्ञासा रखने वाले किसी व्यक्ति के लिए: इस पोस्ट को पढ़ें ।


5

मुझे लगता है कि स्टॉप उपयोगी है यदि आप एल्प्स किए गए मूल्य का पुन: उपयोग करना चाहते हैं।


लेकिन मुझे अपने उदाहरण की आवश्यकता नहीं है :)
डेरियस

फिर यह बहुत अच्छा है :), मुझे "केवल" का उपयोग करना चाहिए था वर्ग डिस्पोज़ इंटरफ़ेस को लागू नहीं करता है, इसलिए कोई भी सफाई ट्रिगर नहीं होनी चाहिए।
vvv

2
@vvv यदि आप चाहते हैं कि आप अपने उत्तर में जोड़ सकते हैं - उत्तर और टिप्पणियों के बीच एक बटन है जो "संपादित करें" कहता है।
डिफ़ॉल्ट

0

यदि आपके कोड को गणना करने की आवश्यकता नहीं है, तो Stop () का उपयोग करने की आवश्यकता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.