JavaScript-da ýatlyk sarp edilişini optimizasiýa etmek
Ähli döredilen üýtgeýjiler kompýuteriň operatiw ýatlygynda saklanýar. Käwagt akyldan daşary kod ýazmak sarp edilýän ýatlygy kesgitli derejede köpeltmäge sebäp bolup biler.
Geliň mysal bilen göreliň. Bizde 1-den 100000000-e çenli bolan bitin sanlaryň jemyny tapmak meselesi durupdyr diýeliň. Bizde berlen diapazondan bitin sanlar bilen massiw doldurýan funkisiýa bardyr:
function fillArr(a, b) {
let res = [];
for (let i = a; i <= b; i++) {
res.push(i);
}
return res;
}
Şeýle hem, massiwiň elementleriniň jemyny tapan funkisiýa barlygyny düşüneliň:
function getSum(arr) {
let sum = 0;
for (let elem of arr) {
sum += elem
}
return sum;
}
Bu funksiýalary birikdirip, goýlan meseläni aňsatlyk bilen çözüp bolýar:
let sum = getSum(fillArr(1, 100000000));
Gözellikli çözgüt çykdy. Şonda-de, onda bir mesele bar: ol örän uly mukdarda operatiw ýatlyk sarp edýär.
Geliň hasaplaýalyň. <fillArr funksiýasy
100000000 san bilen massiw döredýär.
JavaScript-in bir sana 2 baýt bölüp berýändigini düşünelň
- onda bizim massiwimizi saklamak üçin
200000000 baýt, ýagny takmynan
200 megabaýt operatiw ýatlyk gerek bolar.
Aslynda, massiw saklanylanda JavaScript-de örän uly goşmaça çykdaýyşlar bolany üçin, has köp operatiw ýatlyk gerek bolar.
Meseläni düşünmek bilen, mesele çözýän we praktiki operatiw ýatlyk sarp etmeýän funksiýany ýasamak aňsat:
function getNumsSum(max) {
let sum = 0;
for (let i = 1; i <= max; i++) {
sum += i;
}
return sum;
}
Mesele çözmek üçin öz funksiýamyzy ulanýarys:
let sum = getNumsSum(100000000);
Bir programmaçynyň öňünde berlen interwalda ýerleşýän we 7-e galdyksyz bölünýän sanlaryň sanyny tapmak meselesi durdy. Ony şu ýalňyşlykda çözdi:
let arr = [];
for (let i = 0; i <= 1000; i++) {
if (i % 7 == 0) {
arr.push(i);
}
}
console.log(arr.length);
Bu kodyň näme üçin ýalňyşdygyny düşündiriň. Kody has takyk etmek üçin üýtgediň.
Bir programmaçynyň öňünde sanyň bölüjileriniň jemini tapmak meselesi durdy. Ony şu ýalňyşlykda çözdi:
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);
Bu kodyň näme üçin ýalňyşdygyny düşündiriň. Kody has takyk etmek üçin üýtgediň.