अद्यतन: नोड 0.6 के साथ शुरू यह पोस्ट अप्रचलित है, क्योंकि स्टडआउट अब तुल्यकालिक है।
खैर देखते हैं कि console.log
वास्तव में क्या करता है।
सबसे पहले यह कंसोल मॉड्यूल का हिस्सा है :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
तो यह बस कुछ स्वरूपण करता है और लिखता है process.stdout
, अतुल्यकालिक अब तक कुछ भी नहीं।
process.stdout
स्टार्टअप पर परिभाषित एक गेटर है जो आलसी रूप से आरंभिक है, मैंने चीजों को समझाने के लिए कुछ टिप्पणियां जोड़ी हैं:
.... code here...
process.__defineGetter__('stdout', function() {
if (stdout) return stdout; // only initialize it once
/// many requires here ...
if (binding.isatty(fd)) { // a terminal? great!
stdout = new tty.WriteStream(fd);
} else if (binding.isStdoutBlocking()) { // a file?
stdout = new fs.WriteStream(null, {fd: fd});
} else {
stdout = new net.Stream(fd); // a stream?
// For example: node foo.js > out.txt
stdout.readable = false;
}
return stdout;
});
TTY और UNIX के मामले में हम यहाँ समाप्त होते हैं , यह बात सॉकेट से विरासत में मिली है। तो वह सब जो नोड बेसिसली करता है वह डेटा को सॉकेट पर पुश करने के लिए होता है, फिर टर्मिनल बाकी की देखभाल करता है।
चलिए इसे टेस्ट करते हैं!
var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
data += data; // warning! gets very large, very quick
}
var start = Date.now();
console.log(data);
console.log('wrote %d bytes in %dms', data.length, Date.now() - start);
परिणाम
....a lot of ones....1111111111111111
wrote 208896 bytes in 17ms
real 0m0.969s
user 0m0.068s
sys 0m0.012s
टर्मिनल को सॉकेट्स सामग्री को प्रिंट करने के लिए लगभग 1 सेकंड की आवश्यकता होती है, लेकिन टर्मिनल को डेटा को पुश करने के लिए नोड को केवल 17 मिलीसेकंड की आवश्यकता होती है।
वही स्ट्रीम केस के लिए जाता है, और फाइल केस को एसिंक्रोनस हैंडल किया जाता है ।
तो हाँ Node.js अपने गैर-अवरुद्ध वादों के लिए सही है।