การปรับแต่งเพื่อให้ CRDT เร็วขึ้น
(josephg.com)- บทความอธิบายกระบวนการค้นหาและแก้ปัญหาของไลบรารี CRDT ที่มีอยู่เดิมเพื่อทำให้เร็วขึ้น
→ การทดสอบเบนช์มาร์ก: ป้อนข้อความ 180,000 ตัวอักษร, ลบ 70,000 ตัวอักษร, ย้ายเคอร์เซอร์ 100,000 ครั้ง
→ เร็วกว่า Automerge 5000x (5 นาที vs. 56ms)
- ทำไม Automerge ถึงช้า?
→ ยิ่งเอกสารมีขนาดใหญ่ โครงสร้างข้อมูลแบบต้นไม้ภายในก็ยิ่งใหญ่ขึ้นและช้าลง
→ ใช้ ImmutableJS เป็นจำนวนมาก ซึ่งฟีเจอร์ดีแต่ช้าและใช้หน่วยความจำมาก
→ ประมวลผลอักขระที่ป้อนเข้าไปแต่ละตัวเป็นไอเท็มแยกกัน
→ ขณะนี้ Automerge กำลังพัฒนาเวอร์ชัน Rust ที่ปรับปรุงประสิทธิภาพไว้แยกต่างหาก
- ไลบรารี Yjs เร็วกว่า Automerge มาก
→ ปรับปรุงโครงสร้างข้อมูล
- Diamond Types: อิมพลีเมนเทชัน CRDT บน Rust
→ เปลี่ยนภาษาเป็น Rust และปรับปรุงโครงสร้างข้อมูลแบบเดียวกับ Yjs เพื่อให้เร็วขึ้น
→ ใช้ Range Tree แทน linked list
→ เมื่อรันด้วย Wasm เร็วกว่า string mutation ใน JS 3 เท่า (0.19s, เร็วกว่า Automerge 1500 เท่า)
→ เมื่อรันแบบ Rust Native ใช้เวลา 0.056s เร็วกว่า 5000 เท่า
ภาคผนวก A - ถ้าจะใช้ CRDT ในแอปของฉัน ควรใช้อะไรดี?
-
ถ้าจะสร้างเครื่องมือทำงานร่วมกันแบบเอกสาร แนะนำ "Yjs" เพราะประสิทธิภาพดีและใช้หน่วยความจำน้อย และน่าจะเร็วขึ้นอีก
-
แน่นอนว่า Automerge ก็ยอดเยี่ยม และน่าจะเร็วขึ้นอีกภายในปีนี้
-
Diamond เร็วมากจริง ๆ แต่ยังต้องเพิ่มฟีเจอร์อีกมาก
-
ถ้าต้องการ DB semantics มากกว่า document semantics แม้จะอิงตาม OT แต่แนะนำ ShareDB
-
กำลังตั้งตารอ Redwood
2 ความคิดเห็น
บทความนี้เป็นบทความล่าสุดของ Joseph Gentle ผู้พัฒนา Google Wave ซึ่งเป็นผู้เขียนบทความด้านล่างนี้ อ่านก่อนจะช่วยให้เข้าใจได้ดีขึ้น
บทความของ Raph Levien ผู้พัฒนา Xi Editor ก็น่าอ้างอิงเช่นกัน
https://github.com/xi-editor/xi-editor/…