技术文章 Daniel Lemire 2026/09/16
文章介绍 C++23 新增的 std::flat_map:它用排序的 key 向量与 value 向量实现,查询为二分查找,可借助 std::sorted_unique 直接接管来自磁盘或网络的两个数组,也支持有序插入、批量 insert_range 和批量构建。作者在 GCC 16.1、-O3 -march=native 的 Intel Xeon 单核上,与 std::map 对比随机逐个插入、有序插入、批量构建和随机查找。结论是:约千级规模下 flat_map 可优于或接近 map;但随机逐个插入百万、千万级 key 时性能呈二次增长,极不适用。有序插入、批量构建和随机查找在大规模下明显更快,主要得益于连续内存布局和更低存储开销。适用边界是读多写少、可批量构建或有序写入的场景,不适合频繁随机单点插入。
推荐收录,因为文章给出了具体基准数据、实现机制和与 std::map 的读写复杂度边界,能直接支撑 C++ 容器选型判断。适合关注性能优化、标准库数据结构和系统编程的读者,尤其可迁移到读多写少、批量构建或序列化场景的取舍分析。主要风险是结果依赖编译器版本与硬件,但作者已说明测试环境,结论边界清晰。
技术文章 Daniel Lemire 2026/09/03
Python的dict和set通常被认为具有平均O(1)的插入与查询性能,本文通过两组实验验证这种看法在理论上和实践中都不严谨。一方面,选择适当间隔的整数作为key可以制造大量哈希冲突,使插入和成员查询的时间随数据规模翻倍而近似翻四倍,呈现二次复杂度。另一方面,即使没有人为构造攻击,当字典规模从1千增长到1百万时,单次查找的时间也因数据超出CPU缓存而大幅上升(实测超过9倍),而使用更紧凑数据布局的fastconstmap库则能保持接近常数的查询时间。作者指出,把哈希表看作常量时间更接近一种简化教学模型而非现实,需警惕该模型带来的认知偏差。文章附带完整代码,适合从事Python性能优化或了解哈希表实际行为的人阅读。
本文由Daniel Lemire撰写,用可复现的代码和实验数据驳斥了“Python dict/set都是O(1)”的常见直觉,并从哈希碰撞和CPU缓存两方面给出成因。内容有原创实验、可量化的结果和替代库,对需要处理大规模键值数据的Python工程师、系统设计者或算法课程教师都有长期参考价值。推荐收录。
技术文章 Phil Eaton - databases
文章在 gosql 项目中扩展索引支持,涵盖 PRIMARY KEY 词法解析、红黑树索引创建、插入时索引维护和 SELECT 查询优化。作者使用 GoLLRB 红黑树存储索引项,通过识别 WHERE 条件中可应用索引的模式,先用索引预筛选行再执行过滤。文章分析当前查询计划仅支持 AND 连接和列与字面量比较,不能合并范围条件,且索引并非总是优于线性扫描。基准测试显示 100 万行插入时带索引内存和耗时增加,但等值查询从秒级降至微秒级,体现空间换时间的权衡。
推荐收录,因为文章通过写一个 Go 语言 SQL 数据库的索引模块,完整展示主键约束解析、红黑树索引构建、插入维护和查询预筛选的端到端实现,并给出有/无索引的实测性能对比。适合想理解数据库索引原理、查询规划和存储引擎实现的读者;其简化取舍与限制分析也可作为进一步阅读真实数据库文档与源码的入门桥梁。
技术文章 Daniel Lemire 2026/08/02
文章对 C++26 标准库新增容器 std::hive 进行了性能基准测试,并与 std::vector 和 std::list 在插入、遍历、删除和内存占用等方面进行对比。实验使用特定编译器、硬件和测试数据,测量了纳秒/元素、指令数和周期数。结果显示 hive 的插入成本约为 vector 的两倍,遍历速度与链表相当且远慢于 vector,主要因跳过字段和缺乏自动向量化;但在元素删除和内存占用上优于 list。作者指出 hive 不是更快的 vector,而是提供了稳定引用和常数时间删除的更好 list。该基准测试为 C++ 开发者在选择容器时提供了具体的性能参考,但结论受限于合成负载和单一硬件平台。
推荐收录,因为文章提供了针对 std::hive 的详细基准测试,用数据揭示了其与 vector 和 list 的性能差距和原因(如指令开销、缓存局部性、自动向量化影响),并给出了实际使用建议。适合 C++ 系统编程和性能优化场景的读者,可帮助他们在需要稳定引用与快速删除时做出容器选择,且评测方法论可迁移至其他数据结构的性能对比。
工程实践 LWN.net 2026/07/15
文章介绍了 Linux 7.2 内核中 io_uring 子系统将工作项跟踪机制从标准链表替换为无锁多生产者单消费者(MPSC)队列的工程实践。作者逐步解释了无锁队列的设计原理,包括原子操作、内存顺序和使用场景,并展示了该变更带来的显著性能提升。文章还讨论了无锁算法在正确性与性能之间的权衡,以及该实现为何适用于 io_uring 的特定工作负载。内容聚焦于真实工程问题、具体实现取舍和可验证的效果,为理解内核并发优化提供了清晰的案例。
推荐收录,因为该文不仅报告了性能提升结果,更深入解析了无锁 MPSC 队列在内核中的具体设计和正确性保障,展示了从问题识别到算法选择、验证的全过程。对从事内核开发、高性能系统设计或对无锁编程感兴趣的读者有直接参考价值,其设计思路和分析方法可迁移至其他并发场景。
技术文章 知乎 - 木鸟杂记 2026/07/12
文章以“意象”和“隐喻”视角,将滑动窗口这一经典工程概念串联到TCP可靠传输(停等、GBN、SR协议)、LeetCode字符串处理(无重复最长子串、最小覆盖子串)、Raft共识算法(同步窗口与应用窗口)以及流式数据调度等多个计算机领域。作者以个人学习与工作经历为线索,逐步揭示滑动窗口的核心结构:序号机制、有限视图和单调移动,并强调其“以有限应对无限”的设计哲学。文中对每个场景的推导过程、关键细节和工程取舍均有说明,尤其点出双指针维护窗口、计数器表达视图等共通技巧。文章偏向概念梳理与跨领域类比,未深入单一实现细节或性能边界,更适合建立全局直觉而非直接作为实现手册。
推荐收录,因为文章将滑动窗口从具体协议和算法中提炼为可迁移的工程隐喻,以生动案例串联多个计算机子领域,能帮助读者建立跨层次的系统思维。适合对分布式系统、算法设计或计算机网络感兴趣的学习者,文中总结的“序号+窗口+滑动”模式可直接迁移至数据管道、状态同步等工程场景。
工程实践 MaskRay 2026/06/27
这篇文章围绕 LLVM SmallVector 的 push_back 热路径优化展开,分析了约 trivially copyable 元素在容量不足时为何会把本应只发生在慢路径的状态保存,意外带到快路径上。作者通过 clang、GCC 和不同库实现的汇编对比指出,fast/slow 合流会迫使 this 和元素值占用被调用者保存寄存器,shrink wrapping 无法消除这些开销。随后提出把 grow-and-store 拆成独立的尾调用慢路径,让快路径只保留一次比较、一次存储和一次递增,从而显著缩短指令序列并减少寄存器压力。文章还验证了 libc++、libstdc++、Boost small_vector 的类似问题,并说明这个改动对二进制体积、编译时指令数和少数内联阈值敏感点的影响。其边界在于慢路径会更慢且 noinline 很关键,但由于扩容本就要搬移元素,额外一次调用的代价通常可接受。
收录依据很明确:文章给出了汇编、shrink-wrap 诊断和编译时统计,证明问题出在快慢路径合流导致的寄存器溢出,而非简单的代码风格差异。适合做 C++ 标准库、LLVM/编译器后端和性能优化的参考,尤其对需要理解尾调用、内联与寄存器分配权衡的读者可迁移价值很高。