Node.js
Node.js प्रदर्शन
खोज…
इवेंट लूप
ब्लॉकिंग ऑपरेशन उदाहरण
let loop = (i, max) => {
while (i < max) i++
return i
}
// This operation will block Node.js
// Because, it's CPU-bound
// You should be careful about this kind of code
loop(0, 1e+12)
गैर-अवरोधक IO ऑपरेशन उदाहरण
let i = 0
const step = max => {
while (i < max) i++
console.log('i = %d', i)
}
const tick = max => process.nextTick(step, max)
// this will postpone tick run step's while-loop to event loop cycles
// any other IO-bound operation (like filesystem reading) can take place
// in parallel
tick(1e+6)
tick(1e+7)
console.log('this will output before all of tick operations. i = %d', i)
console.log('because tick operations will be postponed')
tick(1e+8)
सरल शब्दों में, इवेंट लूप एक एकल-थ्रेडेड कतार तंत्र है जो आपके सीपीयू-बाउंड कोड को निष्पादित करने के अंत तक और गैर-अवरुद्ध फैशन में आईओ-बाउंड कोड को निष्पादित करता है।
हालाँकि, कालीन के नीचे Node.js अपने कुछ परिचालनों के लिए लिब्रुव लाइब्रेरी के माध्यम से मल्टी-थ्रेडिंग का उपयोग करता है।
प्रदर्शन के विचार
- गैर-अवरुद्ध संचालन कतार को अवरुद्ध नहीं करेगा और लूप के प्रदर्शन को प्रभावित नहीं करेगा।
- हालांकि, सीपीयू-बाउंड ऑपरेशंस कतार को अवरुद्ध कर देगा, इसलिए आपको अपने नोड कोड में सीपीयू-बाउंड ऑपरेशंस न करने के लिए सावधान रहना चाहिए।
Node.js गैर-ब्लॉक IO क्योंकि यह ऑपरेटिंग सिस्टम कर्नेल को कार्य को लोड करता है, और जब IO ऑपरेशन डेटा ( एक घटना के रूप में ) की आपूर्ति करता है, तो यह आपके कोड को आपके आपूर्ति किए गए कॉलबैक के साथ सूचित करेगा।
अधिकतम बढ़ाएँ
मूल बातें
require('http').globalAgent.maxSockets = 25
// You can change 25 to Infinity or to a different value by experimenting
Node.js डिफ़ॉल्ट रूप से एक ही समय में ( अधिकतम v0.12.0 के बाद से) maxSockets = Infinity
का उपयोग कर रहा है। नोड v0.12.0 तक, डिफ़ॉल्ट maxSockets = 5
(देखें v0.11.0 )। इसलिए, 5 से अधिक अनुरोधों के बाद उन्हें कतारबद्ध किया जाएगा। यदि आप समवर्ती चाहते हैं, तो इस संख्या को बढ़ाएं।
अपना खुद का एजेंट सेट करना
http
API " Global Agent " का उपयोग कर रहा है। आप अपने खुद के एजेंट की आपूर्ति कर सकते हैं। ऐशे ही:
const http = require('http')
const myGloriousAgent = new http.Agent({ keepAlive: true })
myGloriousAgent.maxSockets = Infinity
http.request({ ..., agent: myGloriousAgent }, ...)
पूरी तरह से सॉकेट पूलिंग को बंद करना
const http = require('http')
const options = {.....}
options.agent = false
const request = http.request(options)
नुकसान
यदि आप एक ही प्रभाव चाहते हैं तो आपको
https
एपीआई के लिए भी ऐसा ही करना चाहिएउदाहरण के लिए, AWS
Infinity
बजाय 50 का उपयोग करेगा।
गज़िप सक्षम करें
const http = require('http')
const fs = require('fs')
const zlib = require('zlib')
http.createServer((request, response) => {
const stream = fs.createReadStream('index.html')
const acceptsEncoding = request.headers['accept-encoding']
let encoder = {
hasEncoder : false,
contentEncoding: {},
createEncoder : () => throw 'There is no encoder'
}
if (!acceptsEncoding) {
acceptsEncoding = ''
}
if (acceptsEncoding.match(/\bdeflate\b/)) {
encoder = {
hasEncoder : true,
contentEncoding: { 'content-encoding': 'deflate' },
createEncoder : zlib.createDeflate
}
} else if (acceptsEncoding.match(/\bgzip\b/)) {
encoder = {
hasEncoder : true,
contentEncoding: { 'content-encoding': 'gzip' },
createEncoder : zlib.createGzip
}
}
response.writeHead(200, encoder.contentEncoding)
if (encoder.hasEncoder) {
stream = stream.pipe(encoder.createEncoder())
}
stream.pipe(response)
}).listen(1337)