2016-06-05 7 views
18

क्या होता है जब आप DateTime.Now पर कॉल करते हैं?डेटटाइम.अब एक I/O बाध्य ऑपरेशन है?

मैंने प्रतिबिंब में संपत्ति कोड का पालन किया और ऐसा लगता है कि वर्तमान लोकेल का समय क्षेत्र ऑफसेट UtcNow पर जोड़ता है। UTCNow के बाद मुझे नेतृत्व किया, अंततः एक Win32 एपीआई कॉल के लिए बारी बारी से।

मैंने इसे परिलक्षित किया और a related question से पूछा लेकिन अभी तक एक संतोषजनक प्रतिक्रिया प्राप्त नहीं हुई है। उस प्रश्न पर वर्तमान टिप्पणी के लिंक से, मैं अनुमान लगाता हूं कि एक हार्डवेयर इकाई है जो समय रखती है। लेकिन मैं यह भी जानना चाहता हूं कि यह किस इकाई में समय रखता है और चाहे वह मानव पठनीय इकाई में समय को परिवर्तित करने के लिए CPU का उपयोग करता है या नहीं। इससे कुछ प्रकाश डाला जाएगा कि दिनांक और समय की जानकारी पुनर्प्राप्त करने के लिए I/O बाध्य या गणनाबद्ध है या नहीं।

+0

आईओ और गणना बाध्य काफी अनिर्धारित शर्तें हैं। क्या आप स्पष्ट कर सकते हैं कि आप किस संपत्ति में रुचि रखते हैं या आप क्या हासिल करना चाहते हैं? – usr

+0

मुझे लगता है कि लाने की तारीख I/O बाध्य है, इसे डेटटाइम के साथ परिवर्तित कर रहा है.अब (यह पठनीय मूल्य सही है?) गणनाबद्ध है। तो, उनमें से दोनों? – Ali

+0

@usr मैं आपके प्रश्न की सीमित समझ और शायद I/O की अवधारणा के कारण आपकी जांच का जवाब देने में असमर्थ हूं और गहराई से गणना करता हूं जो आपके प्रश्न से आपको संकेत मिलता है। मुझे यकीन नहीं है कि मैं क्या चाहता हूं। मैं सिर्फ यह जानना चाहता हूं कि क्या होता है, इसलिए मैं अगली बार 'डेटटाइम.अब' को कॉल करने की योजना बना सकता हूं ताकि मैं इसे अवरुद्ध न कर सकूं। यह उन चीज़ों में से एक है जिन्हें मैंने हाल ही में सोचा था। –

उत्तर

35

आप इस प्रश्न के साथ अनियंत्रित क्षेत्र में गहराई से हैं। कर्नेल द्वारा समय प्रदान किया जाता है: अंतर्निहित देशी एपीआई कॉल NtQuerySystemTime() है। यह विंडोज़ संस्करणों के साथ झुका हुआ है - विंडोज 8 विशेष रूप से अंतर्निहित कार्यान्वयन को स्पष्ट दुष्प्रभावों के साथ बदल देता है।

यह आई/ओ प्रकृति में बाध्य है: समय आरटीसी (रीयल टाइम क्लॉक) द्वारा बनाए रखा जाता है जो एक समर्पित चिप होता था लेकिन आजकल चिपसेट में एकीकृत किया जाता है। लेकिन बहुत मजबूत सबूत हैं कि यह अभ्यास में बाध्य नहीं है I घड़ी के अंतराल के साथ सिंक में समय अपडेट इतनी संभावना है कि इंटरप्ट हैंडलर आरटीसी पढ़ता है और आपको मूल्य की प्रति प्राप्त होती है। जब आप timeBeginPeriod() के साथ टिंकर करते हैं तो आप कुछ देख सकते हैं।

और आप देख सकते हैं कि जब आप इसे प्रोफाइल करते हैं तो यह केवल विंडोज 7 पर ~ 7 नैनोसेकंड लेता है - I/O बाध्य होने के लिए पूरी तरह से तेज़ है।

+2

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

+1

दरअसल, मेरा मानना ​​है कि आरटीसी का उपयोग केवल तब किया जाता है जब बूटिंग और फिर कर्नेल कुछ अन्य टाइमर (संभवतः मुख्य सीपीयू घड़ी) का उपयोग करके स्वयं को समय पर रखता है। –

+0

@ एंड्रेबॉरी एचपीईटी हार्डवेयर में आजकल विभिन्न समय तंत्र का उपयोग करता है। जब यह उपलब्ध नहीं है (पुराना हार्डवेयर) आरटीसी और सीपीयू टाइमर का संयोजन। AFAIK चीजें जैसे 'डेटटाइम.अब' और 'स्लीप' आरटीसी का उपयोग करती हैं।आप वास्तव में इसे एक लूप में जांच सकते हैं और मूल्यों को आरटीसी के लिए विशिष्ट (iirc) 15 एमएस के अंतराल में कूद सकते हैं। – atlaste

4

आप अवरुद्ध होने से चिंतित हैं। ऐसे दो मामले हैं जहां आप इससे बचना चाहते हैं।

  1. यूआई थ्रेड पर यह विलंबता के बारे में है। इससे कोई फ़र्क नहीं पड़ता कि आप क्या करते हैं (आईओ या सीपीयू), इसमें अधिक समय नहीं लग सकता है। अन्यथा यह यूआई थ्रेड को फ्रीज करता है। UtcNow सुपर तेज है इसलिए यह कोई चिंता नहीं है।
  2. कभी-कभी, गैर-अवरुद्ध आईओ का उपयोग थ्रूपुट को स्केल करने के तरीके के रूप में किया जा रहा है क्योंकि अधिक लोड जोड़ा जाता है। यहां, धागे को बचाने का एकमात्र कारण है क्योंकि प्रत्येक थ्रेड बहुत सारे संसाधनों का उपभोग करता है। चूंकि UtcNow पर कॉल करने के लिए कोई एसिंक तरीका नहीं है, इसलिए सवाल म्यूट है। आपको बस इसे कॉल करना होगा।

के बाद से विंडोज पर समय आमतौर पर 60 हर्ट्ज पर अग्रिम मुझे लगता था कि UtcNow के लिए एक कॉल एक में स्मृति चर कि 60 हर्ट्ज पर लिखा है से पढ़ता है। यह सीपीयू बाध्य बनाता है। लेकिन इससे कोई फर्क नहीं पड़ता।

+0

दिलचस्प! क्या आप विंडोज़ की प्रगति '~ 60 हर्ट्ज 'पर कोई लेख जानते हैं? मैं googled लेकिन मुझे मिला सब मॉनीटर ताज़ा दर के बारे में था। – Isaac

+1

यह 64 हर्ट्ज है, कभी 60 नहीं। जब आप SO, ब्राउज़र टिंकर का उपयोग करते हैं तो 100 हर्ट्ज हो जाता है :) –

+1

यह आधुनिक कंप्यूटर पर काफी भिन्न होता है। ऊर्जा प्रबंधन और अनुप्रयोग इसे समायोजित कर सकते हैं। SysInternals ने इसे मॉनिटर करने के लिए एक टूल विकसित किया है: https://technet.microsoft.com/en-us/sysinternals/bb897568.aspx – dlatikay

3

.NET एपीआई पर निर्भर करता है।

https://msdn.microsoft.com/de-de/library/windows/desktop/ms724961(v=vs.85).aspx

जब प्रणाली पहले शुरू होता है, यह कंप्यूटर के वास्तविक समय घड़ी के आधार पर एक मूल्य के सिस्टम का समय सेट और उसके बाद नियमित रूप से समय अपडेट हो जाता है: MSDN API के बारे में यह कहना है [...] GetSystemTime प्रतियां एक SYSTEMTIME के ​​लिए समय [...]

मेरे पास कोई विश्वसनीय सूत्रों मेरी दावा है कि यह SYSTEMTIME संरचना के रूप में संग्रहीत किया जाता है बैकअप लेने के लिए, उसमें अद्यतन पाया है, और बस में नकल बुलाए जाने पर GetSystemTime का बफर प्राप्त करना। सबसे छोटी तार्किक इकाई NtQuerySystemTime सिस्टम कॉल से 100ns है, लेकिन हम सीएलआर के DateTime ऑब्जेक्ट में 1 मिलीसेकंड के साथ समाप्त होते हैं। संकल्प हमेशा एक जैसा नहीं है।

हम लिनक्स पर मोनो के लिए इसे समझने में सक्षम हो सकते हैं, लेकिन शायद ही कभी विंडोज़ के लिए एपीआई कोड स्वयं सार्वजनिक नहीं है। तो यहां एक धारणा है: वर्तमान समय कर्नेल पता स्थान में एक चर है। इसे ओएस द्वारा अपडेट किया जाएगा (अक्सर सिस्टम घड़ी टाइमर इंटरप्ट द्वारा, अक्सर नेटवर्क स्रोत से कम हो सकता है - दस्तावेज का उल्लेख है कि कॉलर मोनोटोनिक व्यवहार पर भरोसा नहीं कर सकते हैं, क्योंकि एक नेटवर्क सिंक वर्तमान समय को पीछे की ओर सही कर सकता है)। ओएस समवर्ती लेखन को रोकने के लिए पहुंच सिंक्रनाइज़ करेगा लेकिन अन्यथा यह एक I/O-महंगा ऑपरेशन नहीं होगा।

हाल के कंप्यूटरों पर, टाइमर अंतराल अब तय नहीं किया गया है, और BIOS और OS द्वारा नियंत्रित किया जा सकता है।एप्लिकेशन कम या उच्च घड़ी की दरों का भी अनुरोध कर सकते हैं: https://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted

+1

सबसे छोटी तार्किक इकाई वास्तव में 100 नैनोसेकंड है। –

+0

अच्छी तरह से, सीएलआर में 'डेटटाइम। मिलिसेकंड' सदस्य है जिसे "मिलीसेकंड घटक, 0 और 99 9 के बीच मान के रूप में व्यक्त किया गया है" और '_SYSTEMTIME.wMilliseconds' फ़ील्ड "को मिलीसेकंड के रूप में दस्तावेज किया गया है। मान्य मान इस सदस्य के लिए 0 99 99 के माध्यम से हैं "। हमें एनएस के लिए 'GetSystemTimePreciseAsFileTime' या [this] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408 (v = vs.85) .aspx # resolution__precision__accuracy__and_stability) देखना होगा। यहां तक ​​कि μs, अपने – dlatikay

+0

@Joker_vD पर एक प्रश्न के लिए पर्याप्त सामग्री, धन्यवाद, मेरे उत्तर – dlatikay

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