การปรับปรุงการใช้หน่วยความจำใน JavaScript
ตัวแปรทั้งหมดที่สร้างขึ้นจะถูกเก็บไว้ ในหน่วยความจำแรมของคอมพิวเตอร์ บางครั้งการเขียนโค้ดโดยไม่ไตร่ตรอง อาจทำให้การใช้หน่วยความจำเพิ่มขึ้นอย่างรวดเร็ว
ลองมาดูตัวอย่างกัน
สมมติว่าเรามีงานคือหาผลรวมของจำนวนเต็มจาก 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 ตัวเลข
สมมติว่า JavaScript จองพื้นที่สำหรับตัวเลขละ 2 ไบต์
- ดังนั้นสำหรับการจัดเก็บอาร์เรย์ของเราจะต้องใช้
200000000 ไบต์ ซึ่งก็คือประมาณ
200 เมกะไบต์ของหน่วยความจำแรม
แต่ในความเป็นจริง จะต้องใช้หน่วยความจำแรมมากกว่านั้น เพราะใน JavaScript มีค่าใช้จ่ายสูงมาก สำหรับการจัดเก็บอาร์เรย์
เมื่อเข้าใจปัญหาแล้ว ก็ง่ายที่จะสร้างฟังก์ชัน ที่แก้ปัญหาและแทบไม่ใช้ หน่วยความจำแรมเลย:
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);
อธิบายว่าอะไรผิดปกติกับโค้ดนี้ จัดการโค้ดใหม่ ให้เหมาะสมกว่าเดิม