Оптимизирани за памет Javascript обекти

След като си мислех за база данни в паметта на nodejs, просто исках да знам какъв е оптималният начин да запазим необходимите ни обекти с данни в паметта. Когато търсих в Google това, намерих страхотен npm пакет, наречен „object-sizeof“. Това е много повече от пакет, от който можете да научите много повече странни неща за javascript. Без допълнителни разговори, нека се потопим в страхотния свят на javascript!

Настройка на околната среда.

Създадох просто ReactJS приложение като площадка за тази статия. Моля, не се колебайте да разклоните това и да изпробвате това сами. https://stackblitz.com/edit/object-sizeof-test?file=src/App.js

Фундаментално разпределение на паметта върху javascript обекти.

Има основно 3 типа променливи на javascript. Те са „низове“, „числа“, „обект“. Какво…!!! това ли е?. No Functions, Symbols и Regex също са типове данни в javascript, но няма да говоря за тях, защото те не се използват нормално за съхраняване на данни.

  • За булева стойност са необходими 4 байта в паметта.
  • За число са необходими 8 байта в паметта. (http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.19) Няма да говоря за BigInt.
  • За низ са необходими 2 байта за знак. Това означава, че пълният размер на низа ще бъде (2 * дължина) в байтове. (http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.16)
  • Както знаем, обектите се конструират с помощта на низове и числа, които ще разгледаме по-късно.

Пример 01

Както обсъдихме в предишния раздел, числата заемат 8 байта в паметта. Това означава,

const a = 1;
const b = 999999999999999999999999999999999999999999999999;

и двете променливи имат едно и също място в паметта. Интересно нали?

Какво да научите: Съхраняването на малки числа вместо по-големи числа няма да намали размера на хранилището ви за данни.

Вижте, че няма разлика в размера по отношение на стойността на числото

Практически случай на използване на това, което научихме: Представете си, че искате да запазите времеви клеймца на обект и си мислите, че за да намалите количеството памет, заето от този обект, запишете относителни времеви клеймца вместо абсолютни времеви отпечатъци чрез намаляване на постоянна сума. Но имайте предвид, че това няма да намали размера на обекта.

Пример 02

Когато става въпрос за низови стойности, трябва да се има предвид дължината на стойностите. Вижте следния пример.

Вижте разликите в паметта между тези два обекта. Стойността на втория обект има само един знак повече от първия.

Какво да научите: Дължината на низа може да направи значителна разлика за разпределението на паметта.

Практически пример: Да приемем, че искаме да запазим държавата на даден потребител като низ. Вместо да ги записвате като „Шри Ланка“ или „Италия“, запазете ги като по-кратка форма като „LKR“ и „ITL“

Пример 03

Знаем, че ключовете на даден обект са низове. Така че поддържането на по-малка дължина на ключовете може да намали размера на обекта.

Наличието на смислен ключ може да улесни живота ви като програмист, но когато наистина ви е грижа за паметта, имайте това предвид.

Пример 04

Това е най-странният пример, който съм срещал. Първо прегледайте следния пример.

Свещенна крава! Успяхте ли да разберете смисъла? Да, запазването на низ с една дължина е най-оптималният начин за памет, вместо запазването на булева стойност. Вижте: https://dev.to/shevchenkonik/memory-size-of-javascript-boolean-3mlj

Пример 05

Направете датата си по-плоска, това ще намали допълнителните разходи за ключове. Да, съгласен съм, тази опция няма да ви спести повече памет, отколкото поддържането на вашите данни по-четими. Изцяло от вас зависи да вземете решението.

Събрах тази информация и примери от търсенето в Google, което направих. Моля, поправете ме, ако съм сгрешил в даден момент, и добавете други странни случаи, на които сте се натъкнали. Наистина оценявам вашите отзиви. Благодаря.