सबसे पहले, आपको यह समझने की आवश्यकता है कि हार्डवेयर और सॉफ़्टवेयर दोनों द्वारा उजागर सीमाओं के कारण कंप्यूटर पर सटीक समय करने के लिए असंभव नहीं है, तो यह बेहद मुश्किल है। अच्छी खबर यह है कि इस तरह की परिशुद्धता शायद ही कभी जरूरी है। दस टिक एक बहुत कम समय की मात्रा है। इस अंतराल में सीपीयू द्वारा बहुत कम काम किया जा रहा है, और यह सांख्यिकीय रूप से महत्वपूर्ण नहीं होगा।
संदर्भ के लिए, विंडोज घड़ी में लगभग 10 मिलीसेकंड (पिछले संस्करणों पर कम) की सटीकता है। DateTime.UtcNow
पर कॉल के साथ अपना कोड लपेटना उससे बेहतर नहीं होगा।
अपने प्रश्न में, आप "एक घटना उठाएं" चाहते हैं। समस्या यह है कि एकमात्र प्रकार की समय-सारणी वस्तु जो विशिष्ट अंतराल पर एक ईवेंट उठाती है Timer
ऑब्जेक्ट है। यह .NET Framework (System.Timers.Timer
, System.Threading.Timer
, और System.Windows.Forms.Timer
) में 3 अलग-अलग अवतारों में उपलब्ध है, जिनमें से सभी का अपना अनूठा उपयोग परिदृश्य और सापेक्ष quirks है, लेकिन उनमें से कोई भी के लिए जो भी पूछ रहा है उसके करीब कहीं भी परिशुद्धता की गारंटी देता है । उन्हें ऐसा करने के लिए भी डिज़ाइन नहीं किया गया है, और न ही ऐसे विंडोज़ एपीआई द्वारा खुलासा किया गया कोई समकक्ष कार्य है जो इस प्रकार की सटीकता प्रदान करने जा रहे हैं।
कारण मैंने पूछा कि आप ऐसा क्यों करना चाहते हैं और यदि आप बेंचमार्क का प्रयास कर रहे हैं तो यह पूरे गेम को बदल देता है। .NET Framework (संस्करण 2.0 के रूप में) Stopwatch
object प्रदान करता है जिसे स्पष्ट रूप से बेंचमार्किंग या प्रदर्शन प्रोफाइलिंग जैसी स्थिति के लिए सटीक रूप से मापने के लिए डिज़ाइन किया गया है। Stopwatch
बस विंडोज एपीआई फ़ंक्शंस QueryPerformanceFrequency
और QueryPerformanceCounter
(जो इसके सुझाव के अनुसार मेरे सुझाव की पुष्टि करनी चाहिए) को लपेटता है। फ्रेमवर्क के पुराने संस्करणों में इस प्रकार की कार्यक्षमता तक पहुंचने के लिए हमें इन कार्यों को पी/इनवॉक करना होता था, लेकिन अब यह आसानी से बनाया गया है। यदि आपको बेंचमार्किंग के लिए अपेक्षाकृत उच्च रिज़ॉल्यूशन वाले टाइमर की आवश्यकता है, तो Stopwatch
आपकी सर्वश्रेष्ठ शर्त है । सिद्धांत रूप में, यह आपको उप-माइक्रोसॉन्ड समय प्रदान कर सकता है।
लेकिन यह इसकी समस्याओं के बिना नहीं है। यह किसी भी घटना को नहीं बढ़ाता है, इसलिए यदि आपका वर्तमान डिज़ाइन इवेंट हैंडलिंग पर निर्भर करता है, तो आपको इसे पुनर्विचार करना होगा। और, यह पूरी तरह सटीक होने की गारंटी नहीं है, या तो। निश्चित रूप से, उच्चतम संभावित रिज़ॉल्यूशन हार्डवेयर बाधाओं के कारण हो सकता है, लेकिन इसका मतलब यह नहीं है कि यह आवश्यक रूप से आपकी निर्दिष्ट आवश्यकताओं को पूरा करेगा। उदाहरण के लिए, यह एकाधिक प्रोसेसर सिस्टम पर अविश्वसनीय हो सकता है जहां Start
और Stop
को उसी प्रोसेसर पर निष्पादित किया जाना है। इससे कोई फर्क नहीं पड़ता, लेकिन it does। प्रोसेसर पर यह subject to being unreliable भी है जो अपनी घड़ी की गति को ऊपर और नीचे थ्रॉटल कर सकता है। और हिम्मत भी है कि मैं यह भी उल्लेख करता हूं कि QueryPerformanceCounter
पर कॉल करने के लिए कुछ समय-समय पर लगभग 5 माइक्रोसॉन्ड भी आधुनिक 2+ गीगाहर्ट्ज प्रोसेसर पर जा रहा है, जो आपको वास्तव में उस उप-माइक्रोसॉन्ड समय को प्राप्त करने में सक्षम होने से रोकता है जो सिद्धांत में अच्छा लगता है। फिर फिर, कोई भी उचित कोड प्रोफाइलर उस समय पर नगण्य समय पर विचार करेगा क्योंकि, यह है।
(यह भी देखें: http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)
स्रोत
2010-11-18 10:49:52
क्यों दुनिया में आप हर 11 टिकों को एक ईवेंट उठाना चाहते हैं? क्या आप इसे कोड प्रोफाइलिंग के लिए उपयोग कर रहे हैं? –
आप सवालों का जवाब नहीं दे रहे हैं। 11 टिक सिर्फ उदाहरण है। मैं चाहता हूं कि उच्च रिज़ॉल्यूशन टाइमर हो। यदि संभव हो, तो 1 टिक तक। और हाँ, मैं कुछ बेंचमार्क करने के लिए एक आवेदन विकसित कर रहा हूँ। –
यही कारण है कि मैं डाउनवॉटिंग टिप्पणियों का समर्थन करता हूं –