“Oldingi blog”da biz Node.js’da Xotirani boshqarish, Garbage Collector (GC) qanday ishlashini va GC hal qiluvchi rol o‘ynaganiga qaramay, xotira oqishining mumkin bo‘lgan sabablarini tushundik. Ushbu blogda Node.js-da xotiradan samarali foydalanishni ta'minlash bo'yicha eng yaxshi amaliyotlarni ko'rib chiqamiz.

GLOBAL O‘ZGARCHILARNING FOYDALANISHINI KASHAYTIRISH

Global o'zgaruvchilar hech qachon axlat yig'ilmagani uchun ularni ortiqcha ishlatmaslikka ishonch hosil qilish yaxshiroqdir.

Javascriptda, ayniqsa, global o'zgaruvchilarni kamaytirish uchun ba'zi jihatlarni yodda tutishingiz kerak

  1. Tasodifiy global hodisalardan saqlaning

Javascript-da, agar siz e'lon qilinmagan o'zgaruvchiga qiymat belgilasangiz, Javascript uni avtomatik ravishda standart rejimda global o'zgaruvchi sifatida ko'taradi. Bundan tashqari, bu global miqyosdagi funktsiyalarda ishlatiladigan "bu" so'zi bilan bir xil.

Misollar:

function apple() {
	red = true; // this red variable gets hoisted in global space
}
function mango() {
// since 'this' in global functions refers to global this varible is hoisted in global space
this.type = "Alphanso";  
}

Yechim: JS faylining yuqori qismida "qat'iy foydalanish" izohi bilan javascriptni qattiq rejimda yozish foydali bo'ladi. Node.js ning yangi versiyalarida siz tugun buyrug'ini ishga tushirishda ‘ — use_strict ‘ bayrog'ini o'tkazish orqali qat'iy rejimni global miqyosda yoqishingiz mumkin.

'use strict'
function apple() {
	red = true; // this will throw an error
}
function mango() {
// this function will have its own scope for 'this'
this.type = "Alphanso";  
}

Ehtiyot bo'ling: O'q funksiyalaridan foydalanganda ehtiyot bo'ling, chunki qat'iy rejimda ham o'q funksiyasidagi "bu" global makonda bo'ladi.

// This will also become a global variable as arrow functions
const plantation = () => {
    this.coconut = "Brown";
}

yechim: Bunday holatlarning oldini olish uchun ESLint’ning no-invalid-this qoidasidan foydalaning.

Global miqyosdan oqilona foydalaning:

  • Iloji boricha global miqyosdan foydalanmang, funktsiyalar ichida mahalliy doiradan unumli foydalaning, chunki bu axlat yig'iladi va xotira bo'sh qoladi.
  • Globalda faqat doimiylar, kesh va qayta ishlatiladigan o'zgaruvchilarni aniqlashga harakat qiling. Qiymatlar kerak bo'lmaganda o'zgaruvchilarni null deb belgilang.
  • Qiymatlarni bir funktsiyadan ikkinchisiga o'tkazish uchun global bo'shliqdan foydalanmang, buning o'rniga funktsiya parametrlaridan foydalaning.
  • Katta narsalarni global miqyosda saqlamang. Agar siz ularni saqlashingiz kerak bo'lsa, kerak bo'lmaganda ularni bekor qiling. Kesh ob'ektlari cheksiz o'sishiga yo'l qo'ymang, bir marta va vaqti-vaqti bilan tozalang.

2. Stack xotirasidan unumli foydalaning

Stakka kirish yig'ma xotiraga kirishdan ko'ra tezroq bo'ladi, shuning uchun stek o'zgaruvchilari o'z hamkasblariga qaraganda tez-tez foydalanishga harakat qiling. Bu, shuningdek, biz tasodifan xotira oqishiga olib kelmasligimizni ta'minlaydi. Albatta, real stsenariyda faqat statik ma'lumotlardan foydalangan holda foydali dastur yaratish mumkin emas. Ammo biz stackdan yaxshiroq foydalanish uchun ba'zi hiyla-nayranglarga amal qilishimiz mumkin.

  1. Iloji bo'lsa, stek o'zgaruvchilardan yig'ma ob'ekt havolalaridan saqlaning. Bundan tashqari, foydalanilmagan o'zgaruvchilarni saqlamang.
  2. Butun ob'ektlar/massivlarni funksiyalarga o'tkazish o'rniga ob'ekt yoki massivdan kerakli maydonlarni yo'q qiling va foydalaning. Bu yopilishlar ichidagi ob'ektlarga havolani saqlashdan saqlaydi.
function outer() {
    const obj = {
        foo: 1,
        bar: "hello",
    };
const closure = () {
        const { foo } = obj;
        myFunc(foo);
    }
}
function myFunc(foo) {}

3. Uyma xotiradan samarali foydalaning

Haqiqiy ilovalarda yig'ma xotiradan foydalanishdan butunlay voz kechishning iloji yo'q, biroq biz bir nechta maslahatlarga amal qilish orqali uni yanada samaraliroq qilishimiz mumkin:

  1. ob'ektlarga havola qilish o'rniga ularni nusxalash. Agar ob'ekt katta bo'lsa va nusxa ko'chirish qimmat bo'lsa, ma'lumotnomani topshiring.
  2. Ob'ekt mutatsiyalaridan iloji boricha saqlaning, o'rniga ob'ekt tarqalishi yoki object.assign dan foydalaning va nusxasini yarating.
  3. Bitta ob'ektga bir nechta havolalar yaratishdan saqlaning
  4. Katta ob'ektli daraxtlarni yaratishdan saqlaning, aks holda ularni qisqa umr ko'ring

4. Yopish, taymerlar va hodisalarni qayta ishlash vositalaridan foydalanganda ehtiyot bo'ling

Taymerlar uchun, clearTimeout va clearInterval usullari yordamida bajarilganda mutatsiyalar va aniq taymerlarning oldini olish uchun har doim ob'ektlarning nusxalarini uzatishni unutmang.

Bundan tashqari, aniq tinglovchilar ish tugagandan so'ng, ularni abadiy davom ettirmang. Ular ota-ona doirasidan ob'ektga havolani ushlab turgan hollarda.

dastlab “amodshinde.com” da chop etilgan