ชุมชนนักพัฒนา C++ กำลังตื่นเต้นกับไลบรารี Parallel Hashmap โดยนักพัฒนาหลายคนรายงานว่าพบการปรับปรุงประสิทธิภาพที่โดดเด่นเมื่อเปลี่ยนจากคอนเทนเนอร์มาตรฐาน โครงการโอเพนซอร์สนี้ซึ่งพัฒนาต่อยอดจากการใช้งาน swiss table ของ Abseil ได้รับความสนใจจากความสามารถในการจัดการการทำงานแบบขนานและการใช้หน่วยความจำที่มีประสิทธิภาพ
คุณสมบัติหลัก:
- การใช้งานแบบ header-only
- สามารถใช้แทนที่ container มาตรฐานได้ทันที
- ต้องการการรองรับ C++11 (มี API สำหรับ C++14 และ C++17)
- รองรับการค้นหาแบบ heterogeneous
- การ serialize ข้อมูลที่มีประสิทธิภาพสำหรับข้อมูลที่สามารถคัดลอกได้โดยตรง
- รองรับฟังก์ชัน hash_value() ของ boost โดยอัตโนมัติ
ประสิทธิภาพและการนำไปใช้
ไลบรารีนี้นำเสนอการใช้งาน hashmap หลากหลายรูปแบบที่ถูกปรับแต่งสำหรับการใช้งานที่แตกต่างกัน โดยเน้นที่ความสามารถในการประมวลผลแบบขนาน แม้ว่าในตอนแรกหลายคนเข้าใจว่าการทำงานแบบขนานหมายถึงคำสั่ง SIMD แต่จากการพูดคุยในชุมชนพบว่าจุดแข็งที่แท้จริงอยู่ที่ความสามารถในการจัดการการเขียนข้อมูลพร้อมกันได้อย่างมีประสิทธิภาพ ด้วยการกระจายข้อมูลไปยังบัคเก็ตอิสระ การออกแบบนี้ช่วยให้ระบบขยายตัวได้ดีในสภาพแวดล้อมแบบมัลติเธรด เมื่อเทียบกับ hash map แบบดั้งเดิมที่ต้องล็อคตารางทั้งหมด
ไม่มีภาระด้านประสิทธิภาพมากนัก ยังคงได้เทคนิคทั้งหมดของ swiss table
การวิเคราะห์เชิงวิพากษ์จากชุมชน
แม้จะได้รับการตอบรับที่ดี แต่นักพัฒนาบางคนได้ชี้ให้เห็นจุดที่ควรปรับปรุง เอกสารการทดสอบประสิทธิภาพถูกวิจารณ์ว่าเน้นเฉพาะการทดสอบการแทรกข้อมูลแบบสุ่มด้วยจำนวนเธรดที่จำกัด (8 เธรด) ขาดการวิเคราะห์ที่ครอบคลุมในด้านการทำงานแบบผสม สถานการณ์แบบอ่านอย่างเดียว และสถานการณ์ที่มีการทำงานพร้อมกันสูง นอกจากนี้ นักพัฒนาบางคนระบุว่าควรมีการเปรียบเทียบกับการใช้งานสมัยใหม่อื่นๆ เช่น flat_hash_map ของ Abseil เพื่อให้เห็นภาพที่ชัดเจนขึ้น
การนำไปใช้งานจริง
ไลบรารีนี้นำเสนอการใช้งานคอนเทนเนอร์แบบ map และ set สี่รูปแบบ แต่ละแบบมีข้อดีข้อเสียต่างกันในด้านการใช้หน่วยความจำและความเสถียรของพอยน์เตอร์ แม้ว่าจะให้ความยืดหยุ่นในการใช้งาน แต่ก็เพิ่มความซับซ้อนในการเลือกรูปแบบที่เหมาะสมสำหรับการใช้งานเฉพาะ ที่น่าสนใจคือไลบรารีนี้ได้ถูกนำไปใช้ในสภาพแวดล้อมการผลิตจริง รวมถึงการใช้งานที่อาจเกิดขึ้นใน Linux kernel firewall (nftables) ซึ่งต้องการประสิทธิภาพสูงในการทำงานกับ set และ map
ประเภทของคอนเทนเนอร์:
- phmap::flat_hash_set/map
- phmap::node_hash_set/map
- phmap::parallel_flat_hash_set/map
- phmap::parallel_node_hash_set/map
การพัฒนาในอนาคต
พัฒนาการที่น่าสนใจของโครงการนี้คือการแยกออกเป็นสองแนวทาง: รีโพสิทอรี parallel-hashmap ดั้งเดิมที่ต้องการเพียง C++11 และรีโพสิทอรี GTL ใหม่ที่ต้องการ C++20 ผู้พัฒนาแนะนำให้ใช้ GTL สำหรับโครงการที่ใช้ C++20 หรือสูงกว่า เนื่องจากเป็นที่ที่การพัฒนาใหม่ๆ เกิดขึ้น ในขณะที่ parallel-hashmap ยังคงเป็นตัวเลือกสำหรับโครงการที่ใช้คอมไพเลอร์รุ่นเก่า
อ้างอิง: The Parallel Hashmap