एक समय संवेदनशील परियोजना पर काम करते समय, मैंने उपलब्ध समय घटनाओं की ग्रैन्युलरिटी का परीक्षण करने के लिए नीचे दिए गए कोड का उपयोग किया, पहले फ़ायरफ़ॉक्स में मेरी डेस्कटॉप मशीन पर, फिर मेरे लिनक्स सर्वर पर node.js कोड के रूप में। फ़ायरफ़ॉक्स ने 1 एमएमएस टाइमआउट पर 200 एफपीएस औसत अनुमानित परिणामों का अनुमान लगाया और संकेत दिया कि मेरे पास 5 एमएमएस ग्रैन्युलरिटी के साथ समय की घटनाएं थीं।क्यों node.js setTimeout (func, 1.0) को संभालता है गलत तरीके से?
अब मुझे पता है कि अगर मैंने 0 का टाइमआउट मान इस्तेमाल किया है, तो क्रोम वी 8 इंजन नोड.जेएस का निर्माण वास्तव में किसी ईवेंट में टाइमआउट को प्रतिनिधि नहीं करेगा बल्कि तुरंत इसे संसाधित करेगा। जैसा कि अपेक्षित था, संख्या 60,000 एफपीएस औसत थी, स्पष्ट रूप से सीपीयू क्षमता (और शीर्ष के साथ सत्यापित) पर लगातार प्रसंस्करण। लेकिन 1 एमएम टाइमआउट के साथ संख्याएं अभी भी लगभग 3.5-4 हजार चक्र() प्रति सेकेंड थीं, जिसका अर्थ है कि नोड.जेएस संभवतः 1 एमएम टाइमआउट का सम्मान नहीं कर सकता है जो सैद्धांतिक अधिकतम 1 हजार चक्र() प्रति सेकंड बना देगा।
संख्या की श्रेणी के साथ खेलना, मैं मिलता है:
- 2ms: ~ 100 एफपीएस (सच टाइमआउट, लिनक्स पर समय की घटनाओं की 10ms विवरण के स्तर को दर्शाता है)
- 1.5: एक ही
- 1,0001: एक ही
- 1.0: 3,500 - 4,500 एफपीएस
- 0.99: 2,800 - 3,600 एफपीएस
- 0.5: 1,100 - 2,800 एफपीएस
- 0.0001: 1,800 - 3,300 एफपीएस
- 0.0: ~ 60,000 एफपीएस
setTimeout के व्यवहार (समारोह, 0) क्षम्य लगता है, क्योंकि ECMAScript विनिर्देश शायद एक वास्तविक करने के लिए कॉल सौंपने setTimout का कोई वादा करता है ओएस-स्तर बाधा। लेकिन कुछ भीx < = 1.0 के लिए परिणाम स्पष्ट रूप से हास्यास्पद है। मैंने देरी के लिए एक स्पष्ट समय दिया, और एक्स विलंब पर एन कॉल के लिए सैद्धांतिक न्यूनतम समय होना चाहिए (एन -1) * एक्स। क्या बिल्ली V8/Node.js कर रहा है?
var timer, counter = 0, time = new Date().getTime();
function cycle() {
counter++;
var curT = new Date().getTime();
if(curT - time > 1000) {
console.log(counter+" fps");
time += 1000;
counter = 0;
}
timer = setTimeout(cycle, 1);
}
function stop() {
clearTimeout(timer);
}
setTimeout(stop, 10000);
cycle();
क्या मेरा अनुमान है कि कि Node.js टीम जंगली कि 'इस्तेमाल किया 1' एक टाइमआउट मान के रूप में 'यथाशीघ्र' मतलब करने के लिए कोड मनाया है। मुझे बहुत सारे प्रोग्रामर (स्वयं शामिल) लिखने में संकोच करते हैं 'सेटटाइमआउट (कुछफनक, 0)' क्योंकि '0' किसी भी तरह' गलत लगता है '... शून्य का टाइमआउट कोई टाइमआउट नहीं है। '1' इस तरह के कोड में ASAP का मतलब अगले तार्किक मान लगता है। तो नोड.जेएस कोड में शायद 'if (timeout> 1) {scheduleTimeout (someFunc, timeout);} else {scheduleNextTick (someFunc);} ' –
बहुत ही रोचक सवाल बीटीडब्लू है। मुझे इस तरह के शोध से प्यार है! –