Оптимизация длинные списки Да / Нет значения с JavaScript

Очень часто в Веб-разработка (и программирования в целом), вам нужно хранить длинный список логических значений (да / нет, верно / неверно, выбранного / не .
.. вы поняли) в нечто, что принимает только строки.Может быть, это потому, что вы хотите хранить их в localStorage или в печенье, или отправить их через тело запроса HTTP.Я должен был сделать это бесчисленное times.

В последний раз я наткнулся на такой случай не был с моим собственным кодом.Это было, когда христианские Heilmann показал мне свои , то новый слайд deck, с полезная функция, где вы могли переключать видимость отдельные слайды в и из презентации.Увидев это, я был впечатлен.При более детальном рассмотрении, однако, я понял, что флажок государства не сохраняются после перезагрузки страницы.Таким образом, кто-то может провести долгое время тщательно настройки их слайдами, только случайно нажать F5 или сбою браузера, а потом — бум!- Вся их работа будет потеряна.Христианская сказал мне, что он уже работал на хранение флажок состояния в localStorage.Тогда, естественно, мы бесконечно обсуждали формат хранения.Эти дебаты вдохновил меня написать эту статью, чтобы исследовать различные подходы в depth.

Использование Array

У нас есть два (разумный) способы моделирования наших данных в массиве.Одним из них является для хранения True / False значения, например, так:

[false, true, true, false, false, true, true]

Другие для хранения массива 0 и 1, например, так:

[0, 1, 1, 0, 0, 1, 1]

Какой бы решение мы идем с, в конечном итоге мы должны преобразовать его в строку, а затем преобразовать его обратно в массив, когда он читал.У нас есть два способа сделать это:. Либо со старым Array#join() (или Array#toString()) и String#split(), или любитель JSON.stringify() и JSON.parse()

С тем, JSON, код будет несколько короче, хотя это наличие эквивалент нарезки хлеба с бензопилой. Не только есть влияние на производительность в большинстве browsers, но вы также сокращение поддержки браузера довольно bit.

Основной недостаток использования на основе массива строк является их размер в байтах.Если вы идете с числом метода, можно использовать почти в 2 символов на номер (или, точнее, 2N − 1, так как вам понадобится один разделитель за номер, за исключением последнего):

[0, 1, 1, 0, 0, 1, 1].toString().length // 13, for 7 values

Таким образом, на 512 номеров, который был бы 1023 символов или 2 КБ, так как JavaScript использует UTF-16.Если вы идете с логический метод, это еще хуже:

[false, true, true, false, false, true, true].toString().length // 37, also for 7 values

Это около 5 до 6 символов в значение, поэтому 2560 до 3072 символов для 512 номеров (которая составляет от 5 до 6 KB).JSON.stringify() даже отходы еще 2 символов в каждом случае, для открытия и закрытия скобки, но его преимущество в том, что вы получите ваши оригинальные типы значения обратно с JSON.parse() вместо strings.

ИспользованиеString

Использование строк сохраняет некоторое пространство, потому что без разделителей участвуют.Например, если вы идете с подходом числе и хранения строк, как '01001101010111', вы, по сути хранения одного символа на значение, которое является 100% лучше, чем лучше двух предыдущих подходов.Вы можете получить значения в массив с помощью String#split:

'01001101010111'.split(''); // ['0','1','0','0','1','1','0','1','0','1','0','1','1','1']

Или можно просто петлю на строку, используя string.charAt(i) — или даже индексов строк (string[i]), если вы не заботитесь о пожилых browsers.

Использование Bitfields

Ли предыдущий способ заставить вас думать двоичных чисел?Это не только вы.Концепция bitfields является довольно популярным в других языках программирования, но не столько в JavaScript.В двух словах, битовые поля используются для упаковки многих логических значений в bits булевой представление числа.Например, если у вас имеется восемь значений (истина, ложь, ложь, истина, ложь, правда, истина, ложь), то число будет 10010110 в двоичном, так что, 150 в десятичной и 96 в шестнадцатеричной.Это 2 символов вместо 8, так 75% saved.В общем, 1 цифру в шестнадцатеричном представлении соответствует ровно 4 бита.(Это потому, что 16 = 24 В общем, в base2n системе, вы можете упаковать n биты в каждом base2n цифре.). Таким образом, Нам не повезло с этим 75%; это всегда, что much.

Таким образом, вместо хранения этой строки в виде строки и с помощью 1 симв …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.