既知の宇宙で最も遅いストリングファイア。冗談です、それは最速です(:
tl; dr
インストール
それがどのように機能するか
警告
ベンチマーク
ベンチマークを実行します
テストマシン
いくつかの数字
使用法
サポートされているタイプ
スキーマの定義
シンプルな配列でスキーマを定義します
複雑な配列でスキーマを定義します
ネストされたオブジェクトでスキーマを定義します
シリアル化剤
API
SJS
逃げる
ライセンス
SJS
、ネイティブJSON.stringify
とfast-json-stringify
両方でパフォーマンスが大幅に向上することを示しています。一部のユースケース(長いテキストを扱う)では、ネイティブとfast-json-stringify
両方よりも21000%速く実行されます。
注:未定義のプロパティのサポートは1.0.1から追加されています。 SJS
は現在、生産準備が整っています。
チェックアウトベンチマーク。
SJS
、node.jsとブラウザの両方と完全に互換性がありますか?
ノード:
npm slow-json-stringifyをインストールします
ブラウザで:
<スクリプトsrc = "https://unpkg.com/slow-json-strengify/dist/sjs.umd.js"> </script>
なぜSJS
最速のストリングファイアなのですか?従来のアプローチは、特異に取られたすべてのプロパティをシリアル化することにあります。 SJS
シリアル化に異なるアプローチを使用します。
準備:
スキーマが提供されます
スキーマは糸切りされています
テンプレートされた文字列は、提供されたスキーマで構築されています。
シリアル化:
オブジェクト値は、すでに構築されたテンプレートに挿入されます。
それは単に、それがはるかに少ない作業を実行するという理由だけで高速です。
SJS
、Native JSON.stringify
と比較して、セットアップ作業が必要です。しかし、 SJS
固定構造でJSONと扱っている場合、時間を大幅に節約できます。特にペイロードが成長するとき。そして、非常に長いテキストでJSONをシリアル化するとき(ブログ記事または製品の説明を考えてください。さらに、 SJS
、 JSON.stringify
によってネイティブにサポートされていないタイプのシリアル化を可能にします。
注: SJS
、通常、小さなペイロードでは必要ないため、逃げることはできません。大きなテキストを使用している場合、DBにすでに逃げられたテキストを保存するのはほとんど努力していません。
ただし、 SJS
、逃げるニーズにわずかなユーティリティを提供します。 escape
追加の正規表現が提供されていない場合、デフォルトの正規表現を使用します。
デフォルトのRegex文字列:
/n | r | t | "| /gm
次のようにescape
を使用できます。
const {escase} = require( 'slow-json-stringify'); //追加の正規表現を渡さない場合、デフォルトのは使用されます。 '); //これは「面白い」//逃げる戦略に必要なregexを渡すことができます。
私たちは皆、3種類の嘘があることを知っています。
嘘、ひどい嘘..そしてベンチマーク。
SJS
ユースケースにとって本当に改善される可能性があるかどうかをテストすることを忘れないでください。追加の欠点に伴うパフォーマンスの利点が価値がない場合があるからです。
すべてのベンチマークは、あなた自身のマシンで複製可能です。テストを実行するには:
このレポをクローンします。
依存関係をインストールします。
cd benchmark
。
run.sh
スクリプトchmod +x ./run.sh
の実行可能な権利を付与します。
ベンチマークの結果をfile ./run.sh >> benchmark.md
に保存します
ベンチマークは、Dell XPS 15 9550で実行されました。
CPU: Intel I7 6700HQ
RAM: 16GB
OS: Ubuntu 18.04
ここでベンチマークをチェックアウトします
スキーマの作成は、メインバンドルからエクスポートされたattr
ヘルパーのおかげで発生します。
const {attr} = require( 'sjs');
attr(タイプ、シリアル?)
attr
ヘルパーは、次のタイプをネイティブにサポートしています。
string
number
boolean
null
このシナリオでは、単純な構造を持つ動的array
、ネイティブJSON.stringify
が使用されます。実際のパフォーマンスの利点はないため。
カスタムシリアイザーのおかげで、他のタイプのシリアル化が可能です。
JSONペイロードの正しい弦を弦楽化するには、正しいスキーマが必須です。スキーマを定義することはかなり便利で、冗長ではありません。
const {sjs} = require( 'slow-json-stringify'); // schema definitionconst stringify = sjs({{ A:attr( 'string')、 B:attr( 'number')、 c:attr( 'boolean')、}); //その構造で何でもstringify.stringify({{ A:「世界」、 B:42、 c:true、}); // {"a": "world"、 "b":42、 "c":true}
Stringifing Simple Array JSON.stringify
が内部的に使用される場合。
const {sjs} = require( 'slow-json-stringify'); // schema definitionconst stringify = sjs({{ a:attr( 'array')、}); //その構造を使用して任意のものをストリング化できます。 A:[1、2、3、true、 'world']、}); // {"a":[1,2,3、true、 "world"]}
attr
ヘルパーは、 array
プロパティの追加のsjs
スキーマを受け入れます。
const {sjs} = require( 'slow-json-stringify'); // schema definitionconst 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 definitionconst 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
ヘルパーはシリアイザー関数を受け入れます。 Serializer関数は、ストリング化する必要がある実際の値で呼び出されます。
Serializer(RawValue)
Property Serializersは、 JSON.stringify
(日付、正規表現)によってもネイティブにサポートされていない提供タイプでカスタムシリアル化を実行するのに役立ちます。また、 undefined
返品時にプロパティシリアルイジャンをスキップするためにも使用できます。
const {sjs} = require( 'slow-json-stringify'); // schema definitionconst 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')、 制限付きプロップ:attr( 'string'、(value)=> isadmin?value:undefined)、});
ユースケース:値のフォーマット
const stringify = sjs({ プロップ:attr( 'string'、(value)=> value.touppercase())、});
パラメーション | タイプ | 必須 | デフォルト | 仕様 |
---|---|---|---|---|
スキーマ | 物体 | はい | 未定義 | 糸状化動作を定義するスキーマ。 |
パラメーション | タイプ | 必須 | デフォルト | 仕様 |
---|---|---|---|---|
タイプ | 弦 | はい | 未定義 | プロパティのタイプ。 |
Serializer | 関数 | いいえ | 身元 | プロパティのシリアル化 /検証に使用される関数。 |
パラメーション | タイプ | 必須 | デフォルト | 仕様 |
---|---|---|---|---|
正規表現 | 正規表現 | いいえ | デフォルトの正規表現 | 正規表現はテキストを逃れるために使用されていました |
mit。