जावास्क्रिप्ट में मेमोरी खपत का अनुकूलन
सभी बनाए गए वेरिएबल कंप्यूटर की रैंडम एक्सेस मेमोरी में संग्रहीत होते हैं। कभी-कभी बिना सोचे-समझे कोड लिखने से मेमोरी की खपत तेजी से बढ़ सकती है।
आइए एक उदाहरण देखें।
मान लीजिए कि हमारे सामने 1
से 100000000 तक के पूर्णांकों का योग
ज्ञात करने का कार्य है।
मान लीजिए कि हमारे पास एक फ़ंक्शन है,
जो किसी दिए गए रेंज से सरणी को
पूर्णांकों से भरती है:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
मान लीजिए कि हमारे पास एक फ़ंक्शन भी है, जो सरणी के तत्वों का योग ज्ञात करती है:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
इन फ़ंक्शनों के संयोजन से दिए गए कार्य को आसानी से हल किया जा सकता है:
let sum = getSum(fillArr(1, 100000000));
हल सुरुचिपूर्ण बन गया। हालाँकि, इसमें एक समस्या है: यह भारी मात्रा में रैंडम एक्सेस मेमोरी की खपत करता है।
आइए गणना करें। फ़ंक्शन fillArr
100000000 संख्याओं वाली एक सरणी बनाता है।
मान लें कि जावास्क्रिप्ट एक संख्या के लिए 2 बाइट
आवंटित करता है
- तब हमारी सरणी को संग्रहीत करने के लिए
200000000 बाइट की आवश्यकता होगी,
यानी लगभग 200 मेगाबाइट रैंडम एक्सेस मेमोरी।
लेकिन वास्तव में, रैंडम एक्सेस मेमोरी की आवश्यकता इससे कहीं अधिक होगी क्योंकि जावास्क्रिप्ट में सरणी को संग्रहीत करते समय ओवरहेड बहुत अधिक होता है।
समस्या को समझते हुए, एक ऐसा फ़ंक्शन बनाना आसान है जो कार्य को हल करता है और व्यावहारिक रूप से रैंडम एक्सेस मेमोरी की खपत नहीं करता:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
अपने फ़ंक्शन से कार्य को हल करें:
let sum = getNumsSum(100000000);
एक प्रोग्रामर के सामने दिए गए
अंतराल में 7 से बिना किसी शेषफल के विभाजित होने वाली
संख्याओं की संख्या ज्ञात करने का कार्य था।
उसने इसे निम्नलिखित तरीके से हल किया:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
समझाएं कि इस कोड में क्या गलत है। कोड को अधिक इष्टतम बनाएं।
एक प्रोग्रामर के सामने किसी संख्या के भाजक का योग ज्ञात करने का कार्य था। उसने इसे निम्नलिखित तरीके से हल किया:
function getDivisors(num) {
let res = [];
for (let i = 1; i <= num; i++) {
if (num % i === 0) {
res.push(i);
}
}
return res;
}
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
let sum = getSum(getDivisors(320));
console.log(sum);
समझाएं कि इस कोड में क्या गलत है। कोड को अधिक इष्टतम बनाएं।