2011-10-20 19 views
6

के बीच डेटाटाइम ग्रैन्युलरिटी मैंने कुछ नेटवर्क डिबगिंग के लिए थोड़ा इंजीनियरिंग ऐप बनाया है। यह आईपी पते की एक सूची लेता है और उपयोगकर्ता सेट टाइमआउट और दर के साथ उन्हें पिंग करता है। यह औसत राउंड-ट्रिप समय लॉग करता है और हर बार जब कोई भेजता है तो यह असफलता की अवधि और यह होने पर एक टाइमस्टैम्प लॉग करता है ...32 बिट और 64 बिट विंडोज़

यही विचार है। मैंने इसे Win7 मशीन पर .Net4 के साथ विकसित किया और इसे XP लैपटॉप के सेट पर रखना पड़ा।

समस्या के दौरान मेरे बॉक्स पर अवधि के मूल्यों को अच्छा एमएस ड्यूरेशंस दिखाते हैं, एक्सपी बॉक्स पर जब मैं देखता हूं कि वे 0 या 15.625 (जादू संख्या?) दिखाते हैं ... और मजाकिया वर्ग, बॉक्स प्रतीक स्ट्रिंग?

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _upTime = DateTime.Now; 
     var span = _upTime.Subtract(_downTime); 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 

यह लॉग है जो लॉग करता है। _ipStatus पिंग विफलता कारण (आमतौर पर टाइमआउट) है।

_downEventLog.AppendLine(" Duration-> " + linkDownLogEvent._span.TotalMilliseconds + "ms\n"); 

यह प्रिंट है जो प्रिंट करता है ... क्या कोई इस स्पष्ट अंतर पर कोई प्रकाश डाल सकता है?

प्रश्न का उत्तर दिया गया है, लेकिन मैं कुछ और जानकारी के लिए यहां एक संपादन शामिल करूंगा।

संपादित करें:

ऐसा लगता है कि अंतर नीचे Win7 और WinXP अंतर लेकिन 32bit और 64bit करने के लिए नहीं था।

एक 32 बिट विंडोज़ सिस्टम में Henk के रूप में अंक बाहर, सिस्टम घड़ी की ग्रैन्युलरिटी 15-16ms है, यह क्या मुझे समयावधि के लिए हर मूल्य कम से कम 16ms के लिए 15.625 का मूल्य दिया है।

64 बिट सिस्टम में सिस्टम कॉल उन तरीकों के एक अलग सेट के लिए है जो बहुत अधिक बारीक ग्रैन्युलरिटी रखते हैं। तो x64 में मेरी देव मशीन पर मेरे सिस्टम घड़ी से एमएस सटीकता थी!

अब, स्टॉपवॉच प्रोसेसर इंस्ट्रूमेंटेशन के माध्यम से एक बहुत अधिक बारीक ग्रैन्युलरिटी रिकॉर्ड करने के लिए एक हार्डवेयर इंटरफ़ेस का उपयोग करता है (शायद हर प्रोसेसर टिक नहीं, लेकिन मैं इस सोच के साथ कुछ अजीब सटीक रूप से ऑनलाइन कल्पना करता हूं)। यदि ओएस के अंतर्निहित हार्डवेयर में इस स्तर का वाद्ययंत्र नहीं है, तो यह सिस्टम समय का उपयोग करेगा। तो सावधान रहें! लेकिन मुझे लगता है कि अधिकांश आधुनिक डेस्कटॉप/लैपटॉप में यह उपकरण है ... एम्बेडेड डिवाइस या उस प्रकृति की चीजें शायद नहीं हो सकती हैं, लेकिन तब स्टॉपवॉच क्लास कॉम्पैक्ट फ्रेमवर्क में नहीं है, जहां तक ​​मैं देख सकता हूं (यहां आपको क्वेरीरीफॉर्मेंस काउंटर का उपयोग करना होगा ())।

आशा है कि यह सब मदद करता है। इससे मुझे बहुत मदद मिली है।

if (!_spanStopWatch.IsHighResolution) 
    { 
     throw new ThisMachineIsNotAccurateEnoughForMyLikingException("Find a better machine."); 
    } 

नट और बोल्ट:

public void LinkUp() 
    { 
     if (_isLinkUp) return; 

     _spanStopWatch.Stop(); 
     var span = _spanStopWatch.Elapsed; 
     _downTimeLog.Add(new LinkDown() 
          { 
           _span = span, 
           _status = _ipStatus, 
           _time = _downTime 
          }); 
     _isLinkUp = true; 
    } 
+0

हालांकि यह संभवतः आपकी समस्या का समाधान नहीं है, तो आपको इसे पूरी तरह से करने के बजाय स्ट्रिंग में स्पष्ट रूप से परिवर्तित करने के लिए TotalMilliseconds.ToString() का उपयोग करना चाहिए। – Polynomial

+2

@ पॉलीनोमियल यह बिल्कुल अनावश्यक है, क्योंकि यह सटीक कोड उत्पन्न करेगा। –

उत्तर

5

0 या 15.625 (? जादुई संख्या)

हाँ, का उपयोग कर DateTime.Now है

_spanStopWatch initialiser के आसपास कहीं

एक सीपीयू टाइम्सलाइस की लंबाई के लिए सटीक, आपकी हार्ड के आधार पर 15-20 एमएस बर्तन और ओएस संस्करण।

अधिक सटीक समय के लिए System.Diagnostics.Stopwatch का उपयोग करें।

+2

+1; फिर यदि आपको 'स्टॉपवॉच' के साथ समस्याएं आती हैं, तो इस प्रश्न को जांचें: http://stackoverflow.com/questions/3400254/can-the-net-stopwatch-class-be-this- भयानक –

+0

मैंने कुछ और पढ़ा है ... मुझे लगता है कि यह ग्रैन्युलरिटी चीज है। मेरी देव मशीन 64 बिट है ... इसलिए एक अलग कॉल का उपयोग करता है जिसमें एक बेहतर ग्रैन्युलरिटी होती है। – tigerswithguitars

+0

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

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