อัปเดต:เริ่มต้นด้วยโหนด 0.6 โพสต์นี้ล้าสมัยเนื่องจาก stdout เป็นแบบซิงโครนัสในขณะนี้
เรามาดูกันดีกว่าว่ามีอะไรconsole.log
บ้าง
ก่อนอื่นมันเป็นส่วนหนึ่งของโมดูลคอนโซล :
exports.log = function() {
process.stdout.write(format.apply(this, arguments) + '\n');
};
ดังนั้นมันจึงทำการจัดรูปแบบและเขียนข้อมูลบางอย่างprocess.stdout
โดยไม่มีอะไรที่ไม่ตรงกัน
process.stdout
เป็น getter ที่กำหนดไว้ในการเริ่มต้นซึ่งเริ่มต้นอย่างเฉื่อยชาฉันได้เพิ่มความคิดเห็นเพื่ออธิบายสิ่งต่างๆ:
.... code here...
process.__defineGetter__('stdout', function() {
if (stdout) return stdout;
if (binding.isatty(fd)) {
stdout = new tty.WriteStream(fd);
} else if (binding.isStdoutBlocking()) {
stdout = new fs.WriteStream(null, {fd: fd});
} else {
stdout = new net.Stream(fd);
stdout.readable = false;
}
return stdout;
});
ในกรณีของ TTY และ UNIX เราลงเอยที่นี่สิ่งนี้สืบทอดมาจากซ็อกเก็ต ดังนั้นสิ่งที่โหนดพื้นฐานทำก็คือการดันข้อมูลไปยังซ็อกเก็ตจากนั้นเทอร์มินัลจะดูแลส่วนที่เหลือ
มาทดสอบกัน!
var data = '111111111111111111111111111111111111111111111111111';
for(var i = 0, l = 12; i < l; i++) {
data += data;
}
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 ถือเป็นจริงสัญญาไม่ปิดกั้นของมัน