Самый медленный струн в известной вселенной. Шучу, это самое быстрое (:
TL; DR
Установка
Как это работает
Предостережения
Тесты
Запуск тестов
Тестовая машина
Некоторые цифры
Использование
Поддерживаемые типы
Определение схемы
Определение схемы с простым массивом
Определение схемы со сложным массивом
Определение схемы с вложенными объектами
Сериализаторы
API
SJS
побег
Лицензия
SJS
демонстрирует значительное увеличение производительности как по сравнению с Native JSON.stringify
, так и fast-json-stringify
. Для некоторых вариантов использования (имея дело с длинным текстом), он работает на 21000% быстрее, чем нативные, так и fast-json-stringify
.
Примечание. Поддержка неопределенных свойств была добавлена с 1.0.1 . SJS
теперь готов.
Проценка проверки.
SJS
полностью совместим с Node.js и браузером ??
Узел:
NPM Установите медленную stringify
В браузере:
<script src = "https://unpkg.com/slow-json-stringify/dist/sjs.umd.js"> </script>
Почему SJS
является самым быстрым струнником? Традиционный подход состоит в том, чтобы сериализовать каждую собственность, взятую в одиночку. SJS
использует другой подход к сериализации.
Подготовка:
Схема предоставлена
Схема строка
Шаблонная строка построена с предоставленной схемой.
Сериализация:
Значения объекта вставляются в уже построенный шаблон.
Это быстрее просто потому, что он выполняет гораздо меньше работы.
SJS
требуют некоторой работы по настройке, по сравнению с Native JSON.stringify
. Но если вы имеете дело с JSON с фиксированной структурой, SJS
сэкономит вам множество времени. Особенно, когда полезная нагрузка растет. И невероятно, когда сериализует JSON с длинным текстом внутри (подумайте о статье в блоге или о описании продукта. Более того, SJS
делает возможным сериализацию типов, которые не поддержаны JSON.stringify
благодаря пользовательским сериализаторам.
Примечание: SJS
не выполняет каких -либо сбег, так как вам обычно он не понадобится в небольших полезных нагрузках. Если вы работаете с большим текстом, это может быть очень мало усилий, чтобы хранить в вашем DB уже сбежал текст.
Тем не менее, SJS
предоставляет небольшую утилиту для ваших потребностей в спасении. escape
использует регуляцию по умолчанию, если не предоставлена дополнительная регуляция.
строка режима по умолчанию:
/n | r | t | "| /gm
Вы можете использовать escape
как следующее:
const {Escape} = requin '); // Это "смешно" // Вы можете передать любую репутацию, которую вы хотите для своей стратегии побега. Constst Customescaper = Escape (/"/gm); customescaper ('это" смешно "); // Это" смешно "
Мы все знаем, что есть три вида лжи ..
Ложь, проклятая ложь .. и тесты.
Не забудьте проверить, может ли SJS
реальным улучшением для вашего варианта использования. Потому что бывают случаи, когда преимущества производительности с дополнительными недостатками не могли стоить того.
Каждый тест воспроизводится на вашей собственной машине. Чтобы запустить ваши тесты:
Клонировать это репо.
Установить зависимости.
cd benchmark
.
Грант исполняемых прав на run.sh
сценарий chmod +x ./run.sh
.
Сохраните результаты эталона для файла ./run.sh >> benchmark.md
Цитрицы были выполнены на Dell XPS 15 9550.
ЦП: Intel I7 6700HQ
ОЗУ: 16 ГБ
ОС: Ubuntu 18.04
Проценка проверки здесь
Создание схемы происходит благодаря attr
, экспортируемому из главного пакета.
const {attr} = require ('sjs');
attr (тип, сериализатор?)
attr
Helper изначально поддерживает следующие типы:
string
number
boolean
null
array
, динамический массив с простой структурой, в этом сценарии будет использоваться Native JSON.stringify
. Поскольку нет реальных преимуществ производительности.
Сериализация любого другого типа возможна благодаря индивидуальным сериализаторам.
Для правильной строки вашей полезной нагрузки JSON правильная схема является обязательной. Определение схемы довольно удобно и совсем не словеса.
const {sjs} = require ('slow-json-stringify'); // schema definition consst stringify = sjs ({{{{{{{ A: attr ('String'), b: attr ('number'), C: attr ('boolean'),}); // Тогда вы сможете строить что угодно с помощью этой структуры. A: «Мир», B: 42, C: true,}); // {"a": "world", "b": 42, "c": true}
При строительстве простого массива JSON.stringify
будет использоваться внутри.
const {sjs} = require ('slow-json-stringify'); // schema definition consst stringify = sjs ({{{{{{{ a: attr ('array'),}); // Затем вы сможете обращать что угодно с этой структурой. A: [1, 2, 3, true, 'world'],}); // {"a": [1,2,3, true, "world"]}
Помощник attr
принимает дополнительную схему sjs
для array
.
const {sjs} = require ('slow-json-stringify'); // schema definition consst stringify = sjs ({{{{{{{ A: attr ('array', sjs ({b: array ('string'), c: array ('number'), }))}); // Тогда вы сможете обращать что угодно с помощью этой структуры.stringify ({ A: [{b: 'ciao1', c: 1, }, {b: 'ciao2', c: 2, }, {b: 'ciao3', c: 3, }, {b: 'ciao4', c: 4, }],}); // {"a": [{"b": "ciao1", "c": 1}, {"b": "ciao2", "c": 2}, {"b" : "ciao3", "c": 3}, {"b": "ciao4", "c": 4}]}}}
Определение схем с вложенными объектами довольно просто.
const {sjs} = require ('slow-json-stringify'); // schema definition consst stringify = sjs ({{{{{{{ A: {b: {c: attr ('string'),}, }, D: {e: attr ('number'), },}); stringify ({ A: {b: {c: 'hello',}, }, D: {e: 42, },}); // {"a": {"b": {"c": "hello"}}, "d": {"e": 42}}
Помощник attr
принимает функцию сериализатора. Функция сериализатора вызывается с реальным значением, которое должно быть строки.
сериализатор (RawValue)
Сериализаторы свойств полезны для выполнения пользовательской сериализации на любом типе, не поддержанном даже JSON.stringify
(даты, регулярные выражения). Они также могут быть использованы для пропуска Specy Serializarion при возвращении undefined
.
const {sjs} = require ('slow-json-stringify'); // schema definition consst stringify = sjs ({{{{{{{ a: attr ('number', (value) => {if (value> 10) {return value;} return undefined; })}); stringify ({a: 20}); // {"a": 20} stringify ({a: 5}); // {}
Использование: сериализация любого типа.
// datesconst stringify = sjs ({ Дата: attr ('string', (value) => value.tolocalestring ()),}); // regexpconst stringify = sjs ({ reGEXP: attr ('string', (value) => value.toString ()),});
Использование: Настройка полезных нагрузок на основе прав доступа.
const stringify = sjs ({ publicprop: attr ('String'), RESTRICTEDPROP: attr ('string', (value) => isadmin? Значение: не определен),});
Использование: форматирование значений
const stringify = sjs ({ prop: attr ('string', (value) => value.touppercase ()),});
парамет | тип | необходимый | по умолчанию | спецификация |
---|---|---|---|---|
схема | объект | да | неопределенный | Схема, которая определяет поведение строки. |
парамет | тип | необходимый | по умолчанию | спецификация |
---|---|---|---|---|
тип | нить | да | неопределенный | Тип собственности. |
сериализатор | функция | нет | личность | Функция, используемая для сериализации / проверки свойств. |
парамет | тип | необходимый | по умолчанию | спецификация |
---|---|---|---|---|
регулярно | Регулярное выражение | нет | По умолчанию | Руководство используется для ухода с текстом |
Грань