Thư viện Parallel Hashmap mang lại hiệu suất vượt trội so với các Container chuẩn của C++

BigGo Editorial Team
Thư viện Parallel Hashmap mang lại hiệu suất vượt trội so với các Container chuẩn của C++

Cộng đồng phát triển C++ đang sôi nổi thảo luận về thư viện Parallel Hashmap, với nhiều lập trình viên báo cáo những cải thiện đáng kể về hiệu suất khi chuyển từ các container thư viện chuẩn. Dự án mã nguồn mở này, được xây dựng dựa trên cài đặt swiss table của Abseil, đã thu hút sự chú ý nhờ khả năng xử lý hiệu quả các thao tác đồng thời và tối ưu hóa việc sử dụng bộ nhớ.

Các tính năng chính:

  • Triển khai chỉ dùng header
  • Có thể thay thế trực tiếp cho các container chuẩn
  • Yêu cầu hỗ trợ C++11 (cung cấp API cho C++14 và C++17)
  • Hỗ trợ tra cứu không đồng nhất
  • Tuần tự hóa hiệu quả cho dữ liệu có thể sao chép đơn giản
  • Tự động hỗ trợ hash_value() của boost

Hiệu suất và Triển khai

Thư viện cung cấp nhiều cài đặt hashmap được tối ưu hóa cho các trường hợp sử dụng khác nhau, đặc biệt chú trọng đến khả năng xử lý song song. Mặc dù ban đầu nhiều người cho rằng tính năng song song đề cập đến các lệnh SIMD, nhưng qua thảo luận cộng đồng cho thấy điểm mạnh thực sự nằm ở khả năng xử lý hiệu quả các thao tác ghi đồng thời bằng cách phân phối dữ liệu qua các bucket độc lập. Thiết kế này cho phép khả năng mở rộng tốt hơn trong môi trường đa luồng so với các hash map truyền thống yêu cầu khóa toàn bộ bảng.

Không có nhiều [chi phí hiệu suất], vẫn giữ được tất cả các kỹ thuật của swiss table

Phân tích từ Cộng đồng

Mặc dù nhận được phản hồi tích cực, một số lập trình viên đã chỉ ra các điểm cần cải thiện. Tài liệu đánh giá hiệu năng bị chỉ trích vì chỉ tập trung vào các tác vụ chèn ngẫu nhiên với số lượng luồng hạn chế (8 luồng), thiếu phân tích toàn diện về các tác vụ hỗn hợp, kịch bản chỉ đọc và các tình huống có độ đồng thời cao hơn. Ngoài ra, một số lập trình viên lưu ý rằng việc so sánh với các triển khai hiện đại khác như flat_hash_map của Abseil sẽ cung cấp thông tin hữu ích.

Ứng dụng Thực tế

Thư viện cung cấp bốn cài đặt khác nhau của các container map và set, mỗi loại có những đánh đổi riêng về việc sử dụng bộ nhớ và tính ổn định của con trỏ. Mặc dù điều này mang lại tính linh hoạt, nó cũng tạo ra một số phức tạp trong việc lựa chọn cài đặt phù hợp cho từng trường hợp cụ thể. Đáng chú ý, thư viện đã tìm thấy ứng dụng thực tế trong môi trường sản xuất, bao gồm khả năng sử dụng trong các triển khai tường lửa của Linux kernel (nftables) nơi các thao tác set và map hiệu quả là rất quan trọng.

Các Loại Container:

  • phmap::flat_hash_set/map
  • phmap::node_hash_set/map
  • phmap::parallel_flat_hash_set/map
  • phmap::parallel_node_hash_set/map

Phát triển Tương lai

Một điểm thú vị trong quá trình phát triển của dự án là sự xuất hiện của hai nhánh song song: kho lưu trữ parallel-hashmap ban đầu chỉ yêu cầu C++11, và kho GTL mới hơn yêu cầu C++20. Nhà phát triển khuyến nghị sử dụng GTL cho các dự án sử dụng C++20 trở lên, vì đó là nơi diễn ra phát triển mới, trong khi parallel-hashmap vẫn là lựa chọn phù hợp cho các dự án với yêu cầu trình biên dịch cũ hơn.

Tham khảo: The Parallel Hashmap