Zig 重写的 libc 让 SQLite 慢了 12000 倍:画匠又回来了
来源:dennisforbes.ca — 2026-10
📋 概述
作者的象棋分析服务是 Rust 加 SQLite。一次把约 4 万条 JSON 记录写进库里,本来该是毫秒级的事,实际跑了几分钟,还把一颗核吃满。排查下来问题既不在 SQLite 也不在 Rust,而在用 zig cc 交叉编译 Linux 版时被替换掉的 musl 实现:libzigc 重写的 strspn 第一步就量整串长度,strcspn、strpbrk、strstr 同样如此。分词器一边前进一边跳过空白,于是每一步都重新量剩余串长,复杂度退化成平方。1.2MB 的 JSON 分词慢了约 12000 倍,且随文件变大而按平方恶化。Mac 本地构建不走 zig,所以从未复现。
🔑 核心要点
- 症状:4 万条记录入库从毫秒级变成分钟级,而且是纯 CPU 打满一颗核。
- 根因:libzigc 重写的 strspn、strcspn、strpbrk、strstr 每次都先量整个剩余串长。
- 后果:分词器逐步跳空白,重复量长度,复杂度退化到平方,1.2MB 文件慢约 12000 倍。
- 只在 Linux 上出现,因为 Mac 本机构建不用 zig cc 编译 SQLite。
- 作者的临时解法是先把 JSON 里的空白裁掉,再把 Linux 构建迁回容器。
- 文章把它接回 Joel Spolsky 的「Shlemiel 画匠」:老陷阱在 2026 年照样能重演。
💡 金句
在 2026 年,同样古老的问题还能重演,而我们每个人都得对它保持警惕。
👍 0
👎 0
← 返回 Lobsters 首页