C++26 的 std::hive 有多快?

Lobsters Hottest 工具

摘要

本文针对新的 C++26 std::hive 容器与 std::vector 和 std::list 进行了基准测试,结果表明其插入成本约为 vector 的两倍,迭代时与 list 一样受延迟限制,但在局部性和分散删除时的 erase 性能上更优。

<p><a href="https://lobste.rs/s/jqydry/how_fast_is_c_26_s_std_hive">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/08/03 01:33

# C++26 的 std::hive 有多快? Source: https://lemire.me/blog/2026/08/02/how-fast-is-c26s-stdhive/ C++26 在标准库中新增了一个容器:`std::hive`。它意在填补 `std::vector` 和 `std::list` 之间的空白。与 vector 类似,它将元素保存在连续的内存块中,因此遍历时你不需要为每个元素追索指针。与 list 类似,一旦元素被插入,它就永远不会移动:你的指针、引用和迭代器始终保持有效,并且你可以在常数时间内删除任意元素,而不影响其他元素。 在内部,hive 是一个由块组成的链表。每个块携带一个 *skipfield*(跳过字段):每个槽位有一个小整数,它告诉迭代器需要跳过多已删除的槽位。 据我所知,目前还没有标准库提供 `std::hive`。幸运的是,有一个实现(plf::hive (https://github.com/mattreecebentley/plf_hive),作者 Matt Bentley)以单个头文件的形式提供,你今天就可以使用。 我使用的元素类型是 `uint64_t`,编译器为 GCC 16.1,并启用了 `-O3 -march=native`,运行在 Intel Xeon Gold 6548N(Emerald Rapids)上,并固定在一个核心上。数字是每元素的纳秒数,以及每元素退役的周期数和指令数。 我们从空容器开始,追加一百万个值,然后销毁容器。 | container | ns/element | instructions/element | |---|---|---| | `std::vector` (`reserve`) | 0.29 | 8.0 | | `std::vector` | 0.81 | 8.0 | | `std::hive` | 1.57 | 16.2 | | `std::hive` (`reserve`) | 1.76 | 17.0 | | `std::list` | 14.22 | 220.0 | `std::list` 每个元素需要一次分配,而 glibc 的 malloc 和 free 加起来,每个元素要花费超过 200 条指令。它落后于其他所有容器一个数量级。这并不新鲜。 有趣的对比是 vector 与 hive。hive 的成本大约是 vector 的两倍,所需指令数也是两倍。这是 skipfield 的代价:每次插入都要写入一个元素 *和* 一个 skipfield 条目,并维护块的记账信息。注意,在我的实验中,对 hive 调用 `reserve` 并无帮助。 接下来,我们遍历容器并对值求和。 | container | ns/element | cycles/element | instructions/element | |---|---|---|---| | `std::vector` | 0.22 | 0.78 | 1.0 | | `std::list` | 1.51 | 5.27 | 4.0 | | `std::hive` | 1.77 | 6.18 | 9.0 | 在这里,hive 的迭代速度并不比链表快,实际上还要稍慢一些,并且比 vector 慢约八倍。 vector 的循环每元素只退休一条指令,并在 0.78 个周期内完成:处理器同时执行多个元素。这之所以可能,是因为 `std::vector` 的实现受益于

相似文章

C++26 发布了一个无人要求的 SIMD 库

Lobsters Hottest

文章批评了 C++26 中的新 std::simd 库,认为它比标量循环慢,编译速度慢,并且被自动向量化器和 Google Highway 等替代库超越,质疑其在经过十年标准化过程后的价值。

C++ 标准库在过去十五年间一直在自我撤步,证据公开

Lobsters Hottest

一份详细的目录,列出了从 C++11 到 C++26 期间被正式弃用、非正式不推荐或由于 ABI 约束实际上已损坏但无法修复的 C++ 标准库特性。文章指出,C++ 委员会推出一系列替代品来替换其自身特性的模式始终如一,其中包含一个基准测试,显示 Rust 和 C++ 标准库容器之间的 P99 延迟差异高达 58 倍。

C++26:标准库强化

Lobsters Hottest

C++26 引入了标准化的库强化机制,用于在运行时捕获常见的未定义行为(如越界访问)。基于 Google 的生产经验,此举仅带来 0.30% 的性能开销,同时将段错误减少了 30%。