2013-02-03 19 views
5

यह ढूँढना कि सिस्टम। डायग्नोस्टिक्स। स्टॉपवॉच क्लास में थोड़े समय की अवधि (यानी 20 सेकंड) पर भी सटीक रूप से गलत लगता है।पावरहेल टाइमर/स्टॉपवॉच सटीकता

$elapsed = [System.Diagnostics.Stopwatch]::StartNew() 
write-host "Started at $(get-date)" 
for ($t=1; $t -le 20; $t++) { 
    Write-Host "Elapsed Time: $($elapsed.Elapsed.ToString())" 
    sleep 1 
    } 
write-host "Ended at $(get-date)" 
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 

    Started at 02/02/2013 15:08:43 
    Elapsed Time: 00:00:00.0329924 
    Elapsed Time: 00:00:01.0417435 
    Elapsed Time: 00:00:02.0547547 
    Elapsed Time: 00:00:03.0689716 
    Elapsed Time: 00:00:04.0820497 
    Elapsed Time: 00:00:05.0963413 
    Elapsed Time: 00:00:06.1113915 
    Elapsed Time: 00:00:07.1244044 
    Elapsed Time: 00:00:08.1396105 
    Elapsed Time: 00:00:09.1528952 
    Elapsed Time: 00:00:10.1659905 
    Elapsed Time: 00:00:11.1800884 
    Elapsed Time: 00:00:12.1940009 
    Elapsed Time: 00:00:13.2081824 
    Elapsed Time: 00:00:14.2223585 
    Elapsed Time: 00:00:15.2375023 
    Elapsed Time: 00:00:16.2506360 
    Elapsed Time: 00:00:17.2656845 
    Elapsed Time: 00:00:18.2790676 
    Elapsed Time: 00:00:19.2928700 
    Ended at 02/02/2013 15:09:04 
    Total Elapsed Time: 00:00:20.3080067 

सटीकता बहाव के इस प्रकार जब PowerShell में स्टॉपवॉच वर्ग का उपयोग कर उम्मीद की जा करने के लिए है: मेरी प्रक्रिया एक गुजरे 20 सेकंड चलाने के लिए एक प्रक्रिया कोडित के लिए 20.3+ सेकंड के समय दिखा रहा है? समय अवधि के लिए आनुपातिक वृद्धि में लगता है (यानी 10 सेकंड 0.1 से 20 और 20 तक 20) है। क्या मेरा कोड गलती है?

उत्तर

2

सवाल यह है कि आप क्या करने की कोशिश कर रहे हैं ? यदि आप यह निर्धारित करने की कोशिश कर रहे हैं कि स्क्रिप्ट चलाने में कितना समय लगता है, तो आपको स्टॉपवॉच का उपयोग करना चाहिए। हालांकि, यदि आप निर्दिष्ट अवधि के बाद कमांड का नया अनुक्रम प्रारंभ करने का प्रयास कर रहे हैं, तो [System.Timers.Timer] का उपयोग करें और टाइमर ऑब्जेक्ट पर विलम्बित ईवेंट के लिए एक ईवेंट पंजीकृत करें। फिर पंजीकृत घटना की कार्रवाई निर्दिष्ट करें जिसे आप पूरा करने की कोशिश कर रहे हैं।

17

आपके पास 20 1 सेकंड पॉज़ हैं, लेकिन आपके पास अन्य चीजें भी चल रही हैं। एक लूप है जो एक चर को बढ़ाता है और परीक्षण करता है, और आप प्रत्येक पुनरावृत्ति पर विलुप्त समय लिखते हैं। ये अतिरिक्त चीजें समय लेती हैं।

यह अभी भी एक 20 सेकंड ठहराव है, और बीता हुआ समय 20 सेकंड के करीब है कम अतिरिक्त सामान PowerShell करना है कि क्योंकि वहाँ:

$elapsed = [System.Diagnostics.Stopwatch]::StartNew() 
write-host "Started at $(get-date)" 
sleep 20 
write-host "Ended at $(get-date)" 
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 
+2

प्रारंभ और समाप्ति लिखें-होस्ट कॉल से छुटकारा पाएं और यह भी करीब होना चाहिए। स्टॉपवॉच विंडोज के उच्च आवृत्ति काउंटर एपीआई का उपयोग करता है, इसलिए यह बहुत सटीक है। –

+0

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

+0

मुझे लगता है कि आप मेरे उदाहरण के बिंदु से चूक गए हैं। मैं यह दिखाने की कोशिश कर रहा था कि 'डायग्नोस्टिक्स। स्टॉपवॉच' वर्ग गलत नहीं है। आपकी स्क्रिप्ट में स्टॉपवॉच का कारण "20.3080067" सेकंड दिखाता है क्योंकि आपकी स्क्रिप्ट सोने के अलावा अन्य चीजें कर रही है। इसके अलावा, 'गेट-डेट' कथन का कारण बिल्कुल 20 सेकेंड अलग दिखता है क्योंकि प्रदर्शित समय निकटतम दूसरे तक गोल होता है। – Rynant