Βελτιστοποίηση της Κατανάλωσης Μνήμης στο JavaScript
Όλες οι μεταβλητές που δημιουργούνται αποθηκεύονται στη μνήμη RAM του υπολογιστή. Μερικές φορές η απερίσκεπτη σύνταξη κώδικα μπορεί να αυξήσει απότομα την κατανάλωση μνήμης.
Ας δούμε ένα παράδειγμα.
Ας υποθέσουμε ότι έχουμε την εργασία να βρούμε
το άθροισμα των ακεραίων αριθμών από 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));
Προέκυψε μια κομψή λύση. Σε αυτήν, ωστόσο, υπάρχει ένα πρόβλημα: καταναλώνει τεράστια ποσότητα μνήμης RAM.
Ας κάνουμε έναν υπολογισμό. Η συνάρτηση fillArr
δημιουργεί έναν πίνακα με 100000000 αριθμούς.
Ας υποθέσουμε ότι το JavaScript διαθέτει 2 bytes
για κάθε αριθμό - τότε για την αποθήκευση του πίνακα μας θα απαιτηθούν
200000000 bytes, δηλαδή περίπου
200 megabytes μνήμης RAM.
Αλλά στην πραγματικότητα θα απαιτηθεί πολύ περισσότερη μνήμη RAM λόγω του γεγονότος ότι το JavaScript έχει πολύ μεγάλες λειτουργικές απαιτήσεις κατά την αποθήκευση πινάκων.
Κατανοώντας το πρόβλημα, είναι εύκολο να δημιουργηθεί μια συνάρτηση, που λύνει την εργασία και πρακτικά δεν καταναλώνει μνήμη RAM:
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);
Εξηγήστε τι δεν πάει καλά με αυτόν τον κώδικα. Αλλάξτε τον κώδικα σε πιο βελτιστοποιημένο.