นักพัฒนา JavaScript สำรวจวิธีการจัดเก็บข้อมูลทางเลือกนอกเหนือจาก BigInts

ทีมชุมชน BigGo
นักพัฒนา JavaScript สำรวจวิธีการจัดเก็บข้อมูลทางเลือกนอกเหนือจาก BigInts

การสำรวจล่าสุดเกี่ยวกับการจัดเก็บข้อมูลการกำหนดค่าภายใน 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