2012-03-10 15 views
40

मैंसेटटाइमआउट का न्यूनतम मिलीसेकंड मूल्य क्या है?

var minValue = 0; 
if (typeof callback == 'function') { 
    setTimeout(callback, minValue); 
} 

इस कोड को जब मैं जावास्क्रिप्ट के साथ कॉलबैक फ़ंक्शन को लागू कर दिया करना चाहते हैं।

लेकिन मैं पाया है कि आधुनिक ब्राउज़रों और कुछ पुराने ब्राउज़र

अलग न्यूनतम टाइमआउट मान है।

मुझे पता है कि शून्य न्यूनतम मूल्य नहीं हो सकता है।

क्या

आधुनिक ब्राउज़रों और संगतता समस्याओं के लिए कुछ पुराने ब्राउज़र के लिए setTimeout का न्यूनतम मूल्य क्या होगा?

+6

[एमडीएन देखें]] (https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting)। हालांकि आप निर्दिष्ट करते समय कभी भी भरोसेमंद नहीं होते हैं। – pimvdb

+1

आप हमेशा एक परीक्षा लिख ​​सकते हैं ... –

+0

@BradChristie आप यूनिटटेस्ट जावास्क्रिप्ट कोड कैसे करते हैं? TDD? – InspiredJW

उत्तर

39

मुझे लगता है कि 10 सभी ब्राउज़र में सबसे विश्वसनीय न्यूनतम होगा, क्योंकि मैंने इसका उपयोग करके बहुत सारे कोड देखे हैं।

हालांकि, 4ms is the minimum for HTML5

वास्तव में, 4ms एचटीएमएल 5 कल्पना द्वारा निर्दिष्ट और 2010 तथा उसके बाद में जारी किया ब्राउज़रों में संगत है है। (फ़ायरफ़ॉक्स 5.0/थंडरबर्ड 5.0/सागरमोकी 2.2) से पहले, नेस्टेड टाइमआउट के लिए न्यूनतम टाइमआउट मान 10 एमएस था।

+0

मुझे खेद है, यह नहीं है (अब नहीं?) सच है। मुझे एक मानक के अलावा [मानक] (http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#timers) में 4 एमएमएस देरी के बारे में कोई बयान नहीं मिल रहा है, एक नोट को छोड़कर: "नोट: टाइमर घोंसला जा सकता है; पांच ऐसे घोंसले टाइमर के बाद, अंतराल को कम से कम चार मिलीसेकंड होने के लिए मजबूर होना पड़ता है।" आगे की जिज्ञासा ने मुझे [इस महान पोस्ट] (https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/Hn3GxRLXmR0/XP9xcY_gBPQJ) के बारे में Google समूहों पर यह बताया कि वे इसे कैसे करते हैं क्रोम। –

+0

@TobbeBrolin चाहे यह कार्यान्वयन में सच है, [यह अभी भी spec में है] (http://www.w3.org/TR/html5/webappapis.html#timers): "यदि वर्तमान में चल रहा कार्य एक ऐसा कार्य है जो था setTimeout() विधि द्वारा बनाया गया, और टाइमआउट 4 से कम है, फिर टाइमआउट को 4 तक बढ़ाएं। " – apsillers

+2

@TobbeBrolin हालांकि, मुझे नहीं लगता कि लैंगेज WHATWG के spec में परिलक्षित होता है। ऐसा लगता है कि डब्ल्यू 3 सी और WHATWG इस पर असहमत हैं। – apsillers

9

आधुनिक ब्राउज़र में न्यूनतम 4ms (HTML5 के रूप में) है, इससे पहले, यह 10 मिमी था। ध्यान दें कि ये समय कभी 100% सटीक नहीं होते हैं।

3

यह लेख फ़ायरफ़ॉक्स, सफ़ारी, और ओपेरा और भूखंडों प्रदर्शन ग्राफ़ के परीक्षण:

http://ejohn.org/blog/analyzing-timer-performance/

फ़ायरफ़ॉक्स 2, ओपेरा, और सफारी सभी देरी

के लिए 10ms के नीचे खिड़की है

पुराने ब्राउज़रों के लिए, आप उस लेख में से एक की तरह परीक्षण कर सकते हैं। मैंने अभी परीक्षण किया है कि आईई 6 में 10 एमएमएस अंतराल का उपयोग करके setInterval के कुछ समय पहले, और मुझे औसत 55ms मिला। setTimeout35ms पर कम दिखता है।

मैंने क्रोमियम में परीक्षण चलाया और ~ 11ms औसत 10ms टाइमआउट के लिए औसत मिला। मैंने इसे 4 एमएमएस और 1 एमएस अंतराल के साथ करने की कोशिश की और दोनों के लिए ~ 4.5ms मिला। साथ ही, ध्यान रखें कि ऑपरेटिंग सिस्टम के बीच संख्या भिन्न हो सकती है।

यदि आप रुचि रखते हैं, तो यहां परीक्षण कोड है:

<script> 
// number of times to call setTimeout before calculating average 
var ITERATIONS = 200; 

window.onload = function() 
{ 
    testTimeout(10, +new Date, 0, 0); 
} 

// calls setTimeout repeatedly at a specified interval, tracking the amount 
// of time that passes between successive calls 
function testTimeout(interval, last, sum, ii) 
{ 
    var time = +new Date; 
    var difference = time - last; 
    sum += difference; 
    if (ii % ITERATIONS == 1) 
    { 
     document.body.innerHTML = sum/ITERATIONS; 
     sum = 0; 
    } 
    window.setTimeout(
     function() { 
      testTimeout(interval, time, sum, ii + 1) 
     }, interval); 
} 
</script> 
3

setTimeout संभवत: sleep or Sleep system call बुला है।

setTimeout की न्यूनतम मात्रा में मिलीसेकंड सहित वास्तविक यांत्रिकी मालिकाना और/या सिस्टम-निर्भर हैं, क्योंकि वे आधिकारिक ईसीएमए चश्मे में नहीं हैं। यह आपके जावास्क्रिप्ट रन-टाइम पर निर्भर करता है, साथ ही साथ जिस सिस्टम पर आप इसे चला रहे हैं।यह देखते हुए, आपका जावास्क्रिप्ट रन-टाइम पूरी तरह से ओवरहेड नहीं जोड़ता है, मिलीसेकंड की न्यूनतम मात्रा आपके ऑपरेटिंग सिस्टम और हार्डवेयर के टाइम्सलाइस रिज़ॉल्यूशन द्वारा निर्धारित की जाती है। समय की सबसे छोटी "नींद" राशि आमतौर पर आपके सिस्टम के scheduling algorithm द्वारा प्रक्रिया को timeslice आवंटित करने के लिए लगती है।

विंडोज (पोस्ट XP) पर उदाहरण के लिए, the documentation for the sleep system call का पता चलता है:

शून्य मान किसी अन्य थ्रेड चलाने के लिए तैयार है के लिए अपनी समय टुकड़ा के शेष त्यागना धागा कारण बनता है। यदि अन्य धागे चलाने के लिए तैयार नहीं हैं, तो फ़ंक्शन तुरंत लौटाता है, और थ्रेड निष्पादन जारी रहता है।

इसका मतलब है कि कुछ अत्यंत दुर्लभ स्थिति है, जहां कोई अन्य प्रक्रिया वर्तमान में hardware thread कि आपके जावास्क्रिप्ट रन-टाइम process पर इंतजार कर रहा है के तहत, पर चल रहा है, इसे तुरंत जारी रखने के लिए हो सकता है, कैसे अपने जावास्क्रिप्ट रन-टाइम के आधार पर लागू किया गया है। आप शायद इस तरह की हालत को अक्सर देख नहीं पाएंगे :)

+1

असली सच्चा उत्तर – Pinal

+4

मुझे यह स्वीकार करना होगा कि यह उत्तर मुझे विश्वास दिलाता नहीं है, क्योंकि यह मुझे लगता है कि मैं javascirpt (ज्यादातर-) सिंगल-थ्रेडेड इवेंट-आधारित निष्पादन के बारे में जानता हूं। क्या आप किसी भी संदर्भ को इंगित कर सकते हैं कि किसी भी जेएस कार्यान्वयन को 'नींद' कहा जाता है? – Davide

+0

* "यह आपके जावास्क्रिप्ट रन-टाइम को कार्यान्वित करने के तरीके के आधार पर तुरंत जारी रह सकता है" * - यदि रनटाइम सही ढंग से कार्यान्वित किया गया है तो वर्तमान कोड निष्पादित होने के बाद तक टाइमआउट नहीं चलेगा - भले ही आप 0 का समय निर्दिष्ट करें अभी भी कतार होगा। – nnnnnn

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

  • कोई संबंधित समस्या नहीं^_^