สตริงที่ช้าที่สุดในจักรวาลที่รู้จัก ล้อเล่นมันเร็วที่สุด (:
tl; dr
การติดตั้ง
มันทำงานอย่างไร
คำเตือน
เกณฑ์มาตรฐาน
ใช้มาตรฐาน
เครื่องทดสอบ
ตัวเลขบางอย่าง
การใช้งาน
ประเภทที่รองรับ
การกำหนดสคีมา
การกำหนดสคีมาด้วยอาร์เรย์ที่เรียบง่าย
การกำหนดสคีมาด้วยอาร์เรย์ที่ซับซ้อน
การกำหนดสคีมาด้วยวัตถุที่ซ้อนกัน
serializers
API
SJS
หนี
ใบอนุญาต
SJS
แสดงประสิทธิภาพที่เพิ่มขึ้นอย่างมีนัยสำคัญเหนือทั้ง JSON.stringify
และ fast-json-stringify
สำหรับบางกรณีการใช้งาน (การจัดการกับข้อความยาว) จะดำเนินการได้เร็วกว่าทั้ง 21,000% และ fast-json-stringify
หมายเหตุ: การสนับสนุนคุณสมบัติที่ไม่ได้กำหนดได้รับการเพิ่มจาก 1.0.1 SJS
พร้อมการผลิตพร้อมแล้ว
เกณฑ์มาตรฐานการชำระเงิน
SJS
เข้ากันได้อย่างเต็มที่กับทั้ง Node.js และเบราว์เซอร์?
โหนด:
npm ติดตั้ง slow-json-stringify
บนเบราว์เซอร์:
<script src = "https://unpkg.com/slow-json-stringify/dist/sjs.umd.js"> </script>
ทำไม SJS
ถึงเป็นสตริงที่เร็วที่สุด? วิธีการแบบดั้งเดิมประกอบด้วยการทำให้เป็นอนุกรมทรัพย์สินทุกแห่งที่ใช้อย่างแปลกประหลาด SJS
ใช้วิธีการที่แตกต่างกันในการทำให้เป็นอนุกรม
การตระเตรียม:
มีสคีมา
สคีมาถูก stringified
สตริงเทมเพลตถูกสร้างขึ้นด้วยสคีมาที่ให้ไว้
การทำให้เป็นอนุกรม:
ค่าวัตถุถูกแทรกในเทมเพลตที่สร้างขึ้นแล้ว
มันเร็วกว่าเพียงเพราะมันทำงานน้อยลงมาก
SJS
ต้องการการตั้งค่าบางอย่างหากเปรียบเทียบกับ JSON.stringify
ดั้งเดิม แต่ถ้าคุณกำลังติดต่อกับ JSON ด้วยโครงสร้างที่แน่นอน SJS
จะช่วยคุณประหยัดเวลาได้มาก โดยเฉพาะอย่างยิ่งเมื่อน้ำหนักบรรทุกเพิ่มขึ้น และอย่างไม่น่าเชื่อเมื่อทำให้ JSON เป็นอนุกรมที่มีข้อความยาวภายใน (คิดถึงบทความบล็อกหรือคำอธิบายผลิตภัณฑ์นอกจากนี้ SJS
ยังทำให้การจัดลำดับประเภทของประเภทที่ไม่ได้รับการสนับสนุนโดย JSON.stringify
ต้องขอบคุณ serializers ที่กำหนดเอง
หมายเหตุ: SJS
จะไม่หลบหนีใด ๆ เพราะคุณมักจะไม่ต้องการมันในน้ำหนักบรรทุกเล็ก ๆ หากคุณกำลังทำงานกับข้อความขนาดใหญ่อาจเป็นความพยายามเพียงเล็กน้อยที่จะเก็บไว้ในฐานข้อมูลของคุณและข้อความที่หลบหนีไปแล้ว
อย่างไรก็ตาม SJS
ให้ประโยชน์เล็กน้อยสำหรับความต้องการในการหลบหนีของคุณ escape
ใช้ regex เริ่มต้นหากไม่มี Regex เพิ่มเติม
สตริง Regex เริ่มต้น:
/n | r | t | "| /gm
คุณสามารถใช้ escape
Like ต่อไปนี้:
const {Escape} = ต้องการ ('slow-json-stringify'); // ถ้าคุณไม่ผ่าน regex เพิ่มเติมใด ๆ จะมีการใช้งานค่าเริ่มต้น '); // นี่คือ "ตลก" // คุณสามารถผ่าน regex ใด ๆ ที่คุณต้องการสำหรับกลยุทธ์การหลบหนีของคุณ customescaper = Escape (/"/gm); customescaper ('นี่คือ" ตลก "'); // นี่คือ" ตลก "
เราทุกคนรู้ว่ามีการโกหกสามประเภท ..
คำโกหกคำโกหกที่ถูกสาป .. และเกณฑ์มาตรฐาน
อย่าลืมทดสอบว่า SJS
อาจเป็นการปรับปรุงที่แท้จริงสำหรับกรณีการใช้งานของคุณหรือไม่ เนื่องจากมีบางครั้งที่ข้อได้เปรียบด้านประสิทธิภาพกับข้อเสียที่เพิ่มขึ้นอาจไม่คุ้มค่า
เกณฑ์มาตรฐานทุกครั้งสามารถจำลองได้บนเครื่องของคุณเอง เพื่อเรียกใช้การทดสอบของคุณ:
โคลน repo นี้
ติดตั้งการพึ่งพา
cd benchmark
ให้สิทธิ์ในการดำเนินการเพื่อ run.sh
สคริปต์ chmod +x ./run.sh
บันทึกผลลัพธ์มาตรฐานเป็นไฟล์ ./run.sh >> benchmark.md
มาตรฐานได้ดำเนินการบน Dell XPS 15 9550
CPU: Intel i7 6700hq
RAM: 16GB
OS: Ubuntu 18.04
เกณฑ์มาตรฐานการชำระเงินที่นี่
การสร้างสคีมาเกิดขึ้นเนื่องจากตัวช่วย attr
ที่ส่งออกจากชุดหลัก
const {attr} = ต้องการ ('sjs');
attr (ประเภท, serializer?)
ผู้ช่วย attr
สนับสนุนประเภทต่อไปนี้:
string
number
boolean
null
array
อาร์เรย์แบบไดนามิกที่มีโครงสร้างง่าย ๆ ในสถานการณ์นี้จะใช้ JSON.stringify
เนื่องจากไม่มีข้อได้เปรียบด้านประสิทธิภาพที่แท้จริง
การทำให้เป็นอนุกรมของประเภทอื่น ๆ เป็นไปได้ด้วย serializers ที่กำหนดเอง
สำหรับการกำหนดสตริงที่ถูกต้องของเพย์โหลด JSON ของคุณสคีมาที่ถูกต้องเป็นสิ่งจำเป็น การกำหนดสคีมานั้นค่อนข้างมีประโยชน์และไม่ถูกต้องเลย
const {sjs} = reghed ('slow-json-stringify'); // schema refinitionconst stringify = sjs ({{ A: attr ('สตริง'), B: attr ('number'), C: attr ('boolean'),}); // จากนั้นคุณสามารถ stringify อะไรก็ได้ด้วย structure.stringify ({ A: 'โลก', B: 42 c: true,}); // {"a": "โลก", "b": 42, "c": true}
เมื่อ stringifying array simple JSON.stringify
จะถูกใช้ภายใน
const {sjs} = reghed ('slow-json-stringify'); // schema refinitionconst stringify = sjs ({{ ตอบ: attr ('array'),}); // จากนั้นคุณสามารถ stringify อะไรก็ได้ด้วย structure.stringify ({ A: [1, 2, 3, True, 'World'],}); // {"A": [1,2,3, True, "World"]}
ผู้ช่วย attr
ยอมรับ sjs
Schema เพิ่มเติมสำหรับคุณสมบัติ array
const {sjs} = reghed ('slow-json-stringify'); // schema refinitionconst stringify = sjs ({{ A: attr ('array', sjs ({b: array ('string'), c: array ('number'), }))}); // จากนั้นคุณสามารถ stringify อะไรก็ได้ด้วย structure.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}]}}
การกำหนด schemas ด้วยวัตถุซ้อนกันนั้นค่อนข้างตรงไปตรงมา
const {sjs} = reghed ('slow-json-stringify'); // schema refinitionconst stringify = sjs ({{ A: {b: {c: attr ('สตริง'),}, - D: {e: attr ('number'), },}); stringify ({ A: {B: {C: 'Hello',}, - D: {E: 42 },}); // {"a": {"b": {"c": "hello"}}, "d": {"e": 42}}
ผู้ช่วย attr
ยอมรับฟังก์ชั่น Serializer ฟังก์ชั่น serializer จะถูกเรียกใช้ด้วยค่าจริงที่ควรได้รับการจัดสรร
Serializer (Rawvalue)
serializers ทรัพย์สินมีประโยชน์ในการดำเนินการอนุกรมที่กำหนดเองในทุกประเภทที่ไม่ได้รับการสนับสนุนโดยธรรมชาติแม้โดย JSON.stringify
(วันที่, นิพจน์ปกติ) พวกเขาสามารถใช้เพื่อข้ามคุณสมบัติ serializarion เมื่อกลับมา undefined
const {sjs} = reghed ('slow-json-stringify'); // schema refinitionconst 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 ()),});
ใช้กรณี: ปรับแต่ง payloads ตามสิทธิ์การเข้าถึง
const stringify = sjs ({ PublicProp: attr ('String') จำกัด PROP: attr ('String', (value) => isadmin? value: undefined),});
ใช้กรณี: การจัดรูปแบบค่า
const stringify = sjs ({ prop: attr ('string', (value) => value.touppercase ()),});
พารามิเตอร์ | พิมพ์ | ที่จำเป็น | ค่าเริ่มต้น | รายละเอียด |
---|---|---|---|---|
สคีมา | วัตถุ | ใช่ | ไม่ได้กำหนด | สคีมาที่กำหนดพฤติกรรมการกำหนดสตริง |
พารามิเตอร์ | พิมพ์ | ที่จำเป็น | ค่าเริ่มต้น | รายละเอียด |
---|---|---|---|---|
พิมพ์ | สาย | ใช่ | ไม่ได้กำหนด | ประเภทของคุณสมบัติ |
เครื่องชูชีพ | การทำงาน | เลขที่ | ตัวตน | ฟังก์ชั่นที่ใช้สำหรับการทำให้เป็นอนุกรม / การตรวจสอบคุณสมบัติ |
พารามิเตอร์ | พิมพ์ | ที่จำเป็น | ค่าเริ่มต้น | รายละเอียด |
---|---|---|---|---|
regex | การแสดงออกปกติ | เลขที่ | Regex เริ่มต้น | regex ใช้เพื่อหลบหนีข้อความ |
MIT