गो

2017-08-21 9 views
16

में समय अवधि को सही ढंग से मापें गो में समय अवधि को मापने का सही तरीका क्या है? अधिकांश आवेदन सिर्फ मानक समय पैकेज और निम्नलिखित दृष्टिकोण का उपयोग करें:गो

var startTime = time.Now() 
doSomeHardWork() 
var duration = time.Since(startTime) // or: time.Now() - startTime 

हालांकि, time.Now() रिटर्न मौजूदा सिस्टम का समय है, जो दो खामियों की ओर जाता है:

  1. प्रणाली समय के दौरान बदले जाने पर माप (उदाहरण के लिए समय क्षेत्र परिवर्तन (डीएसटी) या लीप दूसरे) के कारण, परिणामी अवधि भी गलत है।
  2. सिस्टम समय वास्तविक समय की तुलना में जानबूझकर तेज़ या धीमी गति से टिक सकता है। यह हमेशा जब ऑपरेटिंग सिस्टम एनटीपी समय सर्वर के साथ आंतरिक घड़ी सिंक्रनाइज़ करता होता

    MSDN से (कई बार एक घंटे के लिए हो सकता है जो!):

    [समय सेवा] स्थानीय घड़ी दर अनुमति देने के लिए समायोजित कर देता है यह सही समय की ओर अभिसरण करता है। यदि स्थानीय घड़ी और [सटीक समय नमूना] के बीच का समय अंतर द्वारा स्थानीय घड़ी दर को समायोजित करने के लिए बहुत बड़ा है, तो समय सेवा स्थानीय घड़ी को सही समय पर सेट करती है।

सिस्टम का समय परिवर्तन (या तो स्वयं या डीएसटी की वजह से), यह अमान्य अवधि का पता लगाने और इसे छोड़ने के लिए संभव हो सकता है। लेकिन अगर सिस्टम घड़ी टिक्स करता है उदा। विश्वव्यापी के साथ सिंक्रनाइज़ करने के लिए 10% तेज, यह पता लगाने के लिए व्यावहारिक रूप से असंभव है। यह इरादा व्यवहार है और सिस्टम घड़ी कैसे डिज़ाइन की गई है।

कारण है कि, सबसे अन्य भाषाओं को मापने अवधि के लिए एक समर्पित एपीआइ:

सही तरीका ठीक जाओ में निष्पादन समय को मापने के लिए क्या है?

+0

तकनीकी रूप से 'performance.now()' एक डोम सुविधा है, जावास्क्रिप्ट नहीं। यदि आप जेएस चला रहे हैं उदा। एक सर्वर पर आपके पास कुछ अन्य एपीआई होगा। – OrangeDog

+1

यदि आप कुछ कोड के प्रदर्शन को प्रोफाइल करने का प्रयास कर रहे हैं, तो अक्सर घड़ी घड़ी के बजाए कोर घड़ी चक्रों में समय मापने के लिए सीपीयू प्रदर्शन काउंटर का उपयोग करना उपयोगी होता है, इसलिए सीपीयू आवृत्ति-स्केलिंग कम अंतर बनाती है। (यह समझ में आता है कि यह सीपीयू-बाउंड है, स्मृति-बाध्य नहीं है (क्योंकि स्मृति आवृत्ति आमतौर पर स्थिर रहता है), और निश्चित रूप से I/O बाध्य नहीं है।) पेर्फ काउंटर भी आपको यह जानने में मदद कर सकता है कि * ऐसा * समय क्यों लगता है, उदाहरण के लिए कैश मिस बनाम शाखा mispredicts बनाम उच्च विलंबता लंबी निर्भरता श्रृंखला बनाम वास्तव में सीपीयू फ्रंट एंड या निष्पादन-इकाई थ्रूपुट अधिकतम। –

+0

उदा। लिनक्स 'perf रिकॉर्ड।/a.out' पर, फिर 'perf report'। –

उत्तर

18

Package time

Monotonic घड़ियों

ऑपरेटिंग सिस्टम दोनों एक "दीवार घड़ी," जो घड़ी तुल्यकालन के लिए परिवर्तन के अधीन है, और एक "monotonic घड़ी," जो नहीं है प्रदान करते हैं। सामान्य नियम यह है कि दीवार घड़ी समय बताने के लिए है और मोनोटोनिक घड़ी समय मापने के लिए है। एपीआई को विभाजित करने के बजाय, इस पैकेज में समय के साथ समय लौटाया गया.अब में दीवार घड़ी पढ़ने और एक monotonic घड़ी पढ़ने दोनों शामिल हैं; बाद में समय-बताने संचालन दीवार घड़ी पढ़ने का उपयोग करते हैं, लेकिन बाद में समय-मापने संचालन, विशेष रूप से तुलना और घटाव, मोनोटोनिक घड़ी पढ़ने का उपयोग करें।

उदाहरण के लिए, इस कोड को हमेशा लगभग 20 मिलीसेकंड का एक सकारात्मक बीता हुआ समय की गणना करता है, भले ही दीवार घड़ी आपरेशन के दौरान बदल गया है समय समाप्त हो जा रहा है: इस तरह के time.Since रूप

start := time.Now() 
... operation that takes 20 milliseconds ... 
t := time.Now() 
elapsed := t.Sub(start) 

अन्य मुहावरों, (शुरू करें), समय। (समय सीमा), और समय.अब()। पहले (समय सीमा), दीवार घड़ी रीसेट के खिलाफ समान रूप से मजबूत हैं।

गो 1.9 (24 अगस्त, 2017 को जारी) के साथ शुरू, गो अवधि के लिए एक monotonic घड़ी का उपयोग करता है।

Proposal: Monotonic Elapsed Time Measurements in Go देखें।

+2

यह एक सुंदर genious एपीआई डिजाइन है। एक अलग कार्य प्रदान करने और सही चुनने के लिए प्रोग्रामर पर भरोसा करने से काफी बेहतर (जो कई नहीं करते हैं)। – maja

+0

@maja: मैंने डिज़ाइन दस्तावेज़ (प्रस्ताव) के लिए एक लिंक जोड़ा है। – peterSO

+1

इसका मतलब यह नहीं है कि यदि 'ए' और' बी' बार हैं, तो यह 'बी - ए + ए! = बी' के लिए संभव है? – Dan

6

यह गो 1 में उपलब्ध है।9 (अगस्त 2017) monotonic घड़ियों के साथ, आप इसे से लाभ प्राप्त करने के लिए कुछ भी विशेष करने की ज़रूरत नहीं होगी:

https://tip.golang.org/pkg/time/#hdr-Monotonic_Clocks

ऑपरेटिंग सिस्टम प्रदान करते हैं दोनों एक "दीवार घड़ी," जो परिवर्तन के अधीन है घड़ी सिंक्रनाइज़ेशन के लिए, और एक "monotonic घड़ी," नहीं है। सामान्य नियम यह है कि दीवार घड़ी समय बताने के लिए है और मोनोटोनिक घड़ी समय मापने के लिए है। एपीआई को विभाजित करने के बजाय, इस पैकेज में समय के साथ समय लौटाया गया.अब में दीवार घड़ी पढ़ने और एक monotonic घड़ी पढ़ने दोनों शामिल हैं; बाद में समय-बताने संचालन दीवार घड़ी पढ़ने का उपयोग करते हैं, लेकिन बाद में समय मापने संचालन, विशेष रूप से तुलना और घटाव, मोनोटोनिक घड़ी पढ़ने का उपयोग करें।

उदाहरण के लिए, इस कोड को हमेशा लगभग 20 मिलीसेकंड का एक सकारात्मक बीता हुआ समय की गणना करता है, भले ही दीवार घड़ी आपरेशन के दौरान बदल गया है समय समाप्त हो जा रहा है:

start := time.Now() 
... operation that takes 20 milliseconds ... 
t := time.Now() 
elapsed := t.Sub(start) 

अन्य मुहावरों, इस तरह के समय के साथ। (शुरुआत), समय। (समय सीमा), और समय.अब()। पहले (समय सीमा), दीवार घड़ी रीसेट के खिलाफ समान रूप से मजबूत हैं। time.Now द्वारा मनाया लौट सकते हैं गलत परिणाम अगर समय की

तुलना और घटाव:

time pkg के लिए यह परिवर्तन इस issue, जो रस कॉक्स से बदलाव के लिए इस proposal के लिये कहा से शुरू हो रहा था सिस्टम दीवार घड़ी दो अवलोकनों के बीच रीसेट है। हम समय का विस्तार करने का प्रस्ताव करते हैं। पर समय प्रतिनिधित्व उन गणनाओं में उपयोग के लिए एक अतिरिक्त मोनोटोनिक घड़ी पढ़ने के लिए है। अन्य लाभों के अलावा, इसे के लिए समय के साथ एक मूल समय सीमा माप के लिए असंभव बनाना चाहिए.अब और समय। से ऋणात्मक अवधि या अन्य परिणाम वास्तविकता में आधारित नहीं है।

3

जाओ 1.8 के लिए और इससे पहले कि, सही समय समारोह समय पैकेज के अंदर नहीं है, लेकिन runtime package बजाय में:

func nanotime() int64 

आदेश सही ढंग से निष्पादन समय को मापने के लिए, निम्नलिखित प्रक्रिया इस्तेमाल किया जाना चाहिए :

var startTime = runtime.nanotime() 
doSomeHardWork() 
var duration = runtime.nanotime() - startTime 

दुर्भाग्यवश, विधि स्वयं को बहुत अच्छी तरह से प्रलेखित नहीं किया गया है। यह long discussion if it was really neccessary के बाद this issue में उभरा। गो 1.9 और नए के लिए, केनी ग्रांट के जवाब का संदर्भ लें।

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