में समय अवधि को सही ढंग से मापें गो में समय अवधि को मापने का सही तरीका क्या है? अधिकांश आवेदन सिर्फ मानक समय पैकेज और निम्नलिखित दृष्टिकोण का उपयोग करें:गो
var startTime = time.Now()
doSomeHardWork()
var duration = time.Since(startTime) // or: time.Now() - startTime
हालांकि, time.Now()
रिटर्न मौजूदा सिस्टम का समय है, जो दो खामियों की ओर जाता है:
- प्रणाली समय के दौरान बदले जाने पर माप (उदाहरण के लिए समय क्षेत्र परिवर्तन (डीएसटी) या लीप दूसरे) के कारण, परिणामी अवधि भी गलत है।
सिस्टम समय वास्तविक समय की तुलना में जानबूझकर तेज़ या धीमी गति से टिक सकता है। यह हमेशा जब ऑपरेटिंग सिस्टम एनटीपी समय सर्वर के साथ आंतरिक घड़ी सिंक्रनाइज़ करता होता
MSDN से (कई बार एक घंटे के लिए हो सकता है जो!):
[समय सेवा] स्थानीय घड़ी दर अनुमति देने के लिए समायोजित कर देता है यह सही समय की ओर अभिसरण करता है। यदि स्थानीय घड़ी और [सटीक समय नमूना] के बीच का समय अंतर द्वारा स्थानीय घड़ी दर को समायोजित करने के लिए बहुत बड़ा है, तो समय सेवा स्थानीय घड़ी को सही समय पर सेट करती है।
सिस्टम का समय परिवर्तन (या तो स्वयं या डीएसटी की वजह से), यह अमान्य अवधि का पता लगाने और इसे छोड़ने के लिए संभव हो सकता है। लेकिन अगर सिस्टम घड़ी टिक्स करता है उदा। विश्वव्यापी के साथ सिंक्रनाइज़ करने के लिए 10% तेज, यह पता लगाने के लिए व्यावहारिक रूप से असंभव है। यह इरादा व्यवहार है और सिस्टम घड़ी कैसे डिज़ाइन की गई है।
कारण है कि, सबसे अन्य भाषाओं को मापने अवधि के लिए एक समर्पित एपीआइ:
- जावा
System.nanoTime()
,System.currentTimeMillis()
time.Now()
के बराबर होगा है और गलत - सी #
System.Diagnostics.Stopwatch
- C/C है ++ विंडोज़ पर
QueryPerformanceCounter
औरQueryPerformanceFrequency
- सी ++ 11 और ऊपर
std::chrono::steady_clock
, याstd::chrono::high_resolution_clock
है जब इसकीis_steady
सदस्य निरंतर,true
- जावास्क्रिप्ट
performance.now()
है जबकिnew Date()
के उपयोग गलत
सही तरीका ठीक जाओ में निष्पादन समय को मापने के लिए क्या है?
तकनीकी रूप से 'performance.now()' एक डोम सुविधा है, जावास्क्रिप्ट नहीं। यदि आप जेएस चला रहे हैं उदा। एक सर्वर पर आपके पास कुछ अन्य एपीआई होगा। – OrangeDog
यदि आप कुछ कोड के प्रदर्शन को प्रोफाइल करने का प्रयास कर रहे हैं, तो अक्सर घड़ी घड़ी के बजाए कोर घड़ी चक्रों में समय मापने के लिए सीपीयू प्रदर्शन काउंटर का उपयोग करना उपयोगी होता है, इसलिए सीपीयू आवृत्ति-स्केलिंग कम अंतर बनाती है। (यह समझ में आता है कि यह सीपीयू-बाउंड है, स्मृति-बाध्य नहीं है (क्योंकि स्मृति आवृत्ति आमतौर पर स्थिर रहता है), और निश्चित रूप से I/O बाध्य नहीं है।) पेर्फ काउंटर भी आपको यह जानने में मदद कर सकता है कि * ऐसा * समय क्यों लगता है, उदाहरण के लिए कैश मिस बनाम शाखा mispredicts बनाम उच्च विलंबता लंबी निर्भरता श्रृंखला बनाम वास्तव में सीपीयू फ्रंट एंड या निष्पादन-इकाई थ्रूपुट अधिकतम। –
उदा। लिनक्स 'perf रिकॉर्ड।/a.out' पर, फिर 'perf report'। –