अब जावास्क्रिप्ट में microseconds को मापने का एक नया तरीका है:
http://gent.ilcore.com/2012/06/better-timer-for-javascript.html
हालांकि, अतीत में, मुझे मिलीसेकंड टाइमर से बाहर जावास्क्रिप्ट में 0.1 मिलीसेकंड परिशुद्धता प्राप्त करने का एक कच्चा तरीका मिला। असंभव? नहीं। पढ़ते रहिये:
मैं कुछ हाई-प्रिसिसियो प्रयोग कर रहा हूँ, जिनके लिए स्व-जाँच टाइमर की आवश्यकता होती है, और मैंने पाया कि मैं कुछ सिस्टमों पर निश्चित ब्राउज़रों के साथ 0.1 मिलीसेकंड सटीक रूप से प्राप्त करने में सक्षम था।
मैंने पाया है कि फास्ट सिस्टम पर आधुनिक GPU- त्वरित वेब ब्राउज़र में (जैसे i7 क्वाड कोर, जहां कई कोर निष्क्रिय हैं, केवल ब्राउज़र विंडो है) - मैं अब टाइमर को सटीक-सटीक होने के लिए भरोसा कर सकता हूं। वास्तव में, यह एक बेकार i7 प्रणाली पर इतना सटीक हो गया है, मैं 1,000 से अधिक प्रयासों के साथ मज़बूती से सटीक एक ही मिलीसेकंड प्राप्त करने में सक्षम हूं। केवल जब मैं एक अतिरिक्त वेब पेज, या अन्य लोड करने जैसी चीजों को करने की कोशिश कर रहा हूं, तो मिलीसेकंड सटीकता कम हो जाती है (और मैं समय से पहले जांच करने के बाद सफलतापूर्वक अपनी स्वयं की अपमानित सटीकता को पकड़ने में सक्षम हूं, यह देखने के लिए कि क्या है मेरा प्रसंस्करण समय अचानक 1 या अधिक मिलीसेकंड तक बढ़ गया - इससे मुझे अमान्य परिणामों में मदद मिलती है जो संभवतः सीपीयू के उतार-चढ़ाव से बहुत प्रभावित हुए हैं)।
यह i7 क्वाड-कोर सिस्टम (जब ब्राउज़र विंडो एकमात्र विंडो है) पर कुछ GPU त्वरित ब्राउज़र में इतना सटीक हो जाता है, कि मैंने पाया है कि मैं चाहता हूं कि मैं जावास्क्रिप्ट में 0.1ms परिशुद्धता टाइमर तक पहुंच सकता हूं, क्योंकि सटीकता आखिरकार अब है कुछ उच्च प्रकार के आला अनुप्रयोगों के लिए ऐसे टाइमर परिशुद्धता को सार्थक बनाने के लिए कुछ उच्च-अंत ब्राउज़िंग सिस्टम पर उच्च परिशुद्धता की आवश्यकता होती है, और जहां अनुप्रयोग सटीकता विचलन के लिए स्वयं-सत्यापन करने में सक्षम होते हैं।
जाहिर है यदि आप कई पास कर रहे हैं, तो आप बस कई पास (जैसे 10 पास) चला सकते हैं, फिर 0.1 मिलीसेकंड सटीक प्राप्त करने के लिए 10 से विभाजित कर सकते हैं। यह बेहतर परिशुद्धता प्राप्त करने का एक सामान्य तरीका है - कई पास करें और कुल समय को पास की संख्या से विभाजित करें।
कैसे ... अगर मैं असामान्य रूप से अद्वितीय स्थिति के कारण केवल एक विशिष्ट परीक्षा के एक बेंचमार्क पास कर सकता हूं, तो मुझे पता चला कि मैं ऐसा करके 0.1 (और कभी-कभी 0.01ms) परिशुद्धता प्राप्त कर सकता हूं:
प्रारंभ / कैलिब्रेशन:
- अगली मिलिसेकंड में टाइमर वृद्धि तक प्रतीक्षा करने के लिए एक व्यस्त लूप चलाएं (अगले मिलीसेकंड अंतराल की शुरुआत के लिए संरेखित टाइमर) यह व्यस्त लूप एक मिलीसेकंड से कम रहता है।
- टाइमर बढ़ाने के लिए इंतजार करते समय एक काउंटर को बढ़ाने के लिए एक और व्यस्त लूप चलाएं। काउंटर आपको बताता है कि एक मिलीसेकंड में कितने काउंटर बढ़े हैं। यह व्यस्त लूप एक पूर्ण मिलीसेकंड तक रहता है।
- उपरोक्त को दोहराएं, जब तक कि संख्याएं अल्ट्रा-स्थिर (लोडिंग समय, जेआईटी संकलक, आदि) न हो जाएं। 4. नोट: संख्या की स्थिरता आपको निष्क्रिय प्रणाली पर अपनी प्राप्य सटीकता प्रदान करती है। आप विचरण की गणना कर सकते हैं, यदि आपको सटीक जाँच करने की आवश्यकता है। कुछ ब्राउज़र पर संस्करण बड़े होते हैं, और अन्य ब्राउज़र पर छोटे होते हैं। तेज प्रणालियों पर बड़ा और धीमी प्रणालियों पर धीमा। संगति भी बदलती है। आप बता सकते हैं कि कौन से ब्राउज़र दूसरों की तुलना में अधिक सुसंगत / सटीक हैं। धीमी प्रणाली और व्यस्त सिस्टम, इनिशियलाइज़ेशन पास के बीच बड़े बदलाव का कारण बनेंगे। यह आपको एक चेतावनी संदेश प्रदर्शित करने का अवसर दे सकता है यदि ब्राउज़र आपको 0.1ms या 0.01ms माप की अनुमति देने के लिए पर्याप्त सटीकता नहीं दे रहा है। टाइमर तिरछा एक समस्या हो सकती है, लेकिन कुछ सिस्टम पर कुछ पूर्णांक मिलीसेकंड टाइमर काफी सटीक (डॉट पर काफी सही) बढ़ाते हैं, जिसके परिणामस्वरूप बहुत सुसंगत अंशांकन मूल्यों का परिणाम होगा जिस पर आप भरोसा कर सकते हैं।
- अंतिम काउंटर मान (या पिछले कुछ अंशांकन औसत का औसत) सहेजें
बेंचमार्किंग उप-मिलीसेकंड परिशुद्धता के लिए एक पास:
- अगली मिलीसेकंड तक टाइमर वेतन वृद्धि (अगले मिलीसेकंड अंतराल की शुरुआत के लिए संरेखित टाइमर) तक प्रतीक्षा करने के लिए एक व्यस्त लूप चलाएं। यह व्यस्त लूप एक मिलीसेकंड से कम रहता है।
- उस कार्य को निष्पादित करें जिसे आप समय पर ठीक से बेंचमार्क करना चाहते हैं।
- टाइमर की जाँच करें। यह आपको पूर्णांक मिलीसेकंड देता है।
- टाइमर में वृद्धि के लिए प्रतीक्षा करते समय एक काउंटर को बढ़ाने के लिए एक अंतिम व्यस्त लूप चलाएं। यह व्यस्त लूप एक मिलीसेकंड से कम रहता है।
- प्रारंभ से मूल काउंटर मान द्वारा इस काउंटर मान को विभाजित करें।
- अब आपको मिलीसेकंड का दशमलव भाग मिल गया है !!!!!!!!
चेतावनी: वेब ब्राउज़रों में व्यस्त छोरों की सिफारिश नहीं की जाती है, लेकिन सौभाग्य से, ये व्यस्त छोरें प्रत्येक 1 मिलीसेकंड से भी कम समय तक चलते हैं, और केवल बहुत कम बार ही चलते हैं।
जेआईटी संकलन और सीपीयू उतार-चढ़ाव जैसे चर बड़े पैमाने पर गलतियाँ जोड़ते हैं, लेकिन यदि आप कई आरंभीकरण पास चलाते हैं, तो आपके पास पूर्ण गतिशील पुनर्संयोजन होगा, और अंततः काउंटर बहुत सटीक बैठता है। सुनिश्चित करें कि सभी व्यस्त लूप सभी मामलों के लिए बिल्कुल समान कार्य है, ताकि व्यस्त लूप में अंतर के कारण अंतर न हो। सुनिश्चित करें कि परिणाम पर भरोसा करने से पहले, कोड की सभी पंक्तियों को कई बार निष्पादित किया जाता है, JIT संकलक को पहले से ही एक पूर्ण गतिशील पुनर्नवीनीकरण (dynarec) में स्थिर करने की अनुमति देने के लिए।
वास्तव में, मैंने कुछ प्रणालियों पर माइक्रोसेकंड के निकट आने वाले सटीक रूप से देखा , लेकिन मैं अभी तक इस पर भरोसा नहीं करता। लेकिन 0.1 मिलीसेकंड सटीक एक निष्क्रिय क्वाड-कोर सिस्टम पर काफी मज़बूती से काम करने के लिए प्रकट होता है, जहां मैं केवल ब्राउज़र पृष्ठ हूं। मैं एक वैज्ञानिक परीक्षण के मामले में आया था, जहाँ मैं केवल एक-ऑफ पास कर सकता था (अद्वितीय चर के कारण), और कई बार पास होने के बजाय औसत रूप से प्रत्येक पास को ठीक समय की आवश्यकता थी, इसलिए मैंने ऐसा किया।
मैंने कई प्री-पास और डमी पास (dynarec को निपटाने के लिए) किया, 0.1ms परिशुद्धता (कई सेकंड के लिए ठोस रहना) की विश्वसनीयता को सत्यापित करने के लिए, फिर अपने हाथों को कीबोर्ड / माउस से दूर रखा, जबकि बेंचमार्क ठीक नहीं हुआ, तब कई 0.1ms परिशुद्धता (फिर से ठोस रहना) की विश्वसनीयता को सत्यापित करने के लिए पोस्ट-पास। यह इस बात की भी पुष्टि करता है कि बिजली की स्थिति में परिवर्तन, या अन्य सामान, पहले और बाद के बीच नहीं हुए थे, परिणामों के साथ हस्तक्षेप। प्रत्येक एकल बेंचमार्क पास के बीच प्री-टेस्ट और पोस्ट-टेस्ट दोहराएं। इस पर, मैं काफी वस्तुतः निश्चित था कि बीच में परिणाम सटीक थे। कोई गारंटी नहीं है, लेकिन यह दिखाने के लिए जाता है कि वेब ब्राउज़र में कुछ मामलों में सटीक <0.1ms परिशुद्धता संभव है।
यह विधि केवल बहुत, बहुत आला मामलों में उपयोगी है । फिर भी, यह शाब्दिक रूप से 100% असीम रूप से गारंटीकृत नहीं होगा, आप आंतरिक और बाहरी सत्यापन की कई परतों के साथ संयुक्त होने पर काफी भरोसेमंद सटीकता और यहां तक कि वैज्ञानिक सटीकता प्राप्त कर सकते हैं।