การสำรวจล่าสุดเกี่ยวกับการจัดเก็บข้อมูลการกำหนดค่าภายใน JavaScript BigInts ได้จุดประกายการอภิปรายในชุมชนเกี่ยวกับทางเลือกที่มีประสิทธิภาพมากกว่าสำหรับการจัดการข้อมูลที่มีโครงสร้าง แม้ว่าแนวทาง BigInt จะให้การใช้หน่วยความจำที่กะทัดรัดและการทำ serialization ที่รวดเร็ว แต่นักพัฒนากำลังตั้งคำถามว่าวิธีการแบบดั้งเดิมอาจจะเป็นประโยชน์มากกว่า
ประโยชน์ของแนวทาง BigInt Storage:
- การบีบอัดหน่วยความจำสูงสุด (ค่าบูลีนใช้ 1 บิต, สีเป็นค่า u32)
- การ deserialization ที่รวดเร็วโดยใช้
BigInt("0x" + value)
- การตรวจสอบความเท่าเทียมที่เหมาะสมผ่านการเปรียบเทียบ present bits
- ผลลัพธ์การ serialization ที่กะทัดรัด
ข้อกังวลด้านประสิทธิภาพของการดำเนินการ BigInt
ชุมชนได้หยิบยกข้อกังวลที่สำคัญเกี่ยวกับผลกระทบด้านประสิทธิภาพของการใช้ BigInts สำหรับการจัดเก็บข้อมูล การดำเนินการ bit บน BigInts นั้นช้ากว่าการดำเนินการ object มาตรฐานของ JavaScript โดยธรรมชาติ ทำให้แนวทางนี้น่าสงสัยสำหรับกรณีการใช้งานส่วนใหญ่ ความซับซ้อนของการใช้งานฟังก์ชัน getBits() ยังสร้างคอขวดด้านประสิทธิภาพ เนื่องจากการดำเนินการ bit-shifting แบบดั้งเดิมต้องประมวลผลข้อมูลทั้งหมดที่อยู่เหนือฟิลด์เป้าหมาย ทำให้เกิดการดำเนินการที่ซ้ำซ้อน
หมายเหตุ: getBits() หมายถึงฟังก์ชันที่ดึง bits เฉพาะจากตัวเลขที่ใหญ่กว่าโดยใช้การดำเนินการ bitwise
ข้อเสียของการจัดเก็บข้อมูลด้วย BigInt:
- ฟิลด์ต้องมีการจำกัดความกว้างสูงสุด
- การดำเนินการบิตช้ากว่าออบเจ็กต์ JS ปกติ
- ความซับซ้อนของโค้ดเพิ่มขึ้นอย่างมาก
- ไม่สามารถจัดเก็บข้อมูลที่มีขนาดแบบไดนามิกเช่นสตริงแบบไม่จำกัด
- ต้องสร้างออบเจ็กต์ใหม่สำหรับการแก้ไขฟิลด์ใดๆ
ArrayBuffer และ DataView เป็นทางเลือกที่เหนือกว่า
นักพัฒนาหลายคนได้ชี้ไปที่ ArrayBuffer และ DataView เป็นตัวเลือกที่มีเหตุผลมากกว่าสำหรับการจัดเก็บข้อมูลที่มีโครงสร้าง คุณสมบัติ JavaScript ในตัวเหล่านี้ช่วยขจัดความจำเป็นในการดำเนินการ bitwise ที่ซับซ้อนเมื่อฟิลด์ถูกจัดแนวแบบ byte ให้การใช้งานที่สะอาดกว่าและประสิทธิภาพที่ดีกว่า ไม่เหมือนกับ BigInts แนวทางเหล่านี้ไม่ต้องการการสร้าง object ใหม่ทั้งหมดเมื่อแก้ไขฟิลด์เดียว ทำให้เหมาะสมกว่าสำหรับโครงสร้างข้อมูลที่เปลี่ยนแปลงได้
หมายเหตุ: ArrayBuffer ให้วิธีการจัดเก็บข้อมูลไบนารีดิบ ในขณะที่ DataView เสนอเมธอดสำหรับอ่านและเขียนชนิดข้อมูลต่างๆ ภายใน buffer นั้น
ไลบรารีเฉพาะทางเสนอโซลูชันที่ผ่านการทดสอบ
แทนที่จะสร้างโซลูชัน BigInt แบบกำหนดเอง ชุมชนได้เน้นไลบรารีที่มีอยู่แล้วเช่น Structurae ที่ให้โปรโตคอลที่ผ่านการทดสอบแล้วสำหรับการจัดเก็บและส่งข้อมูลที่มีประสิทธิภาพ ไลบรารีเหล่านี้เสนอโครงสร้างข้อมูลที่ครอบคลุมรวมถึงการใช้งาน BigBitField และ BitArray ซึ่งอาจช่วยประหยัดเวลาในการพัฒนาและลดข้อผิดพลาดเมื่อเปรียบเทียบกับการใช้งานแบบกำหนดเอง
แนวทางทางเลือกที่แนะนำ:
- ArrayBuffer / DataView: เหมาะสำหรับฟิลด์ที่จัดเรียงแบบไบต์ ไม่จำเป็นต้องใช้การดำเนินการแบบบิต
- ไลบรารี Structurae: ให้โปรโตคอลไบนารีที่ผ่านการทดสอบและโครงสร้างข้อมูลแบบกะทัดรัด
- Struct-of-Arrays: แต่ละคุณสมบัติอยู่ในอาร์เรย์ที่พิมพ์แยกต่างหาก ออบเจ็กต์ระบุด้วยดัชนี
- Object Interning: เก็บสำเนาเดียวของการกำหนดค่าที่ไม่ซ้ำกันพร้อมการอ้างอิงหลายครั้ง
แนวทาง Struct-of-Arrays สำหรับการดำเนินการจำนวนมาก
สำหรับสถานการณ์ที่ต้องการการดำเนินการข้าม object หลายตัวที่มี key เหมือนกัน นักพัฒนาแนะนำให้ใช้แนวทาง struct-of-arrays วิธีนี้จัดเก็บแต่ละประเภทของ property ใน typed arrays แยกกัน โดย object จะถูกระบุด้วย indices ที่ไม่ซ้ำกัน การจัดระเบียบเช่นนี้สามารถเร่งการดำเนินการจำนวนมากเช่นการค้นหาค่าร่วมข้าม record หลายตัวได้อย่างมีนัยสำคัญ
การอภิปรายเผยให้เห็นว่าแม้การจัดเก็บ BigInt จะเป็นแบบฝึกหัดทางเทคนิคที่น่าสนใจ แต่การประยุกต์ใช้จริงมักได้ประโยชน์มากกว่าจากทางเลือกที่ได้รับการยอมรับแล้ว ความซับซ้อนที่เพิ่มขึ้นและการแลกเปลี่ยนด้านประสิทธิภาพทำให้การจัดเก็บแบบ BigInt เหมาะสมเฉพาะกรณีการใช้งานที่เฉพาะเจาะจงมากที่การเพิ่มประสิทธิภาพหน่วยความจำสูงสุดมีน้ำหนักมากกว่าความซับซ้อนในการใช้งาน
อ้างอิง: Storing Unwise Amounts of Data in JavaScript Bigints