*«Эффективность» здесь в основном означает меньший размер (, сокращение времени ожидания ввода-вывода)и быстрое время извлечения/десериализации. Время хранения не так важно.
Мне нужно сохранить пару десятков массивов целых чисел, каждый из которых содержит 1800 значений в диапазоне 0-50, в локальном хранилище браузера --, то есть в виде строки.
Очевидно, что самый простой способ — это просто
JSON.stringify
это, однако это добавляет много ненужной информации, учитывая, что диапазоны данных хорошо известны. Тогда средний размер одного из этих массивов составляет ~5500 байт.Вот некоторые другие методы, которые я пробовал (результирующий размер и время на десериализацию 1000 раз в конце)
ноль-заполнение чисел, чтобы каждое было длиной 2 символа, например:
[5, 27, 7, 38] ==> "05270738"
base 50, кодируя его:
[5, 11, 7, 38] ==> "5b7C"
просто используя значение как код символа (добавляя 32, чтобы избежать странных управляющих символов в начале):
[5, 11, 7, 38] ==> "%+'F" (String.fromCharCode(37), String.fromCharCode(43)...)
Вот мои результаты:
size Chrome 18 Firefox 11 ------------------------------------------------- JSON.stringify 5286 60ms 99ms zero-padded 3600 354ms 703ms base 50 1800 315ms 400ms charCodes 1800 21ms 178ms
Мой вопрос в том, есть ли еще лучший метод, который у меня есть еще не рассматривал?
Обновление
MДΓΓБДLL предложил использовать сжатие данных. Объединение этой реализации LZW с базой 50 и данными charCode. Я также протестировал код Арота (, упаковывающий 4 целых числа в 3 байта). Я получил следующие результаты:size Chrome 18 Firefox 11 ------------------------------------------------- LZW base 50 1103 494ms 999ms LZW charCodes 1103 194ms 882ms bitpacking 1350 2395ms 331ms