Optimisation de la consommation mémoire en JavaScript
Toutes les variables créées sont stockées dans la mémoire vive de l'ordinateur. Parfois, écrire du code sans réfléchir peut augmenter brusquement la consommation de mémoire.
Regardons un exemple.
Supposons que nous ayons pour tâche de trouver
la somme des nombres entiers de 1
à 100000000.
Supposons que nous ayons une fonction
qui remplit un tableau
avec des nombres entiers dans un intervalle
donné :
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Supposons que nous ayons également une fonction qui trouve la somme des éléments d'un tableau :
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
En combinant ces fonctions, on peut facilement résoudre la tâche posée :
let sum = getSum(fillArr(1, 100000000));
La solution est élégante. Elle présente cependant un problème : elle consomme une quantité énorme de mémoire vive.
Faisons le calcul. La fonction fillArr
crée un tableau avec 100000000 nombres.
Supposons que JavaScript alloue 2 octets
pour un nombre - alors le stockage de notre tableau nécessitera
200000000 octets, soit environ
200 mégaoctets de mémoire vive.
Mais en réalité, bien plus de mémoire vive sera nécessaire en raison des frais généraux très importants dans JavaScript pour le stockage des tableaux.
En comprenant le problème, il est facile de créer une fonction qui résout la tâche et consomme pratiquement pas de mémoire vive :
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Résolvons la tâche avec notre fonction :
let sum = getNumsSum(100000000);
Un programmeur avait pour tâche de trouver
le nombre de nombres divisibles sans reste par
7, situés dans un intervalle donné.
Il l'a résolue de la manière suivante :
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Expliquez ce qui ne va pas avec ce code. Modifiez le code pour le rendre plus optimal.
Un programmeur avait pour tâche de trouver la somme des diviseurs d'un nombre. Il l'a résolue de la manière suivante :
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);
Expliquez ce qui ne va pas avec ce code. Modifiez le code pour le rendre plus optimal.