用 Rust 把版本号工具提速一万倍:bump2version 诞生记
来源:dev.to — 2026-09-06
📋 概述
作者因受不了 bump-my-version 命令行工具给一个数字(0.1.0→0.1.1)加一竟要等约 585 毫秒,索性用安全 Rust 从零重写了它,并同时提供 Rust crate、Python(bump-rs)与 Node.js 三套绑定及 CLI,还支持 no_std 嵌入。核心引擎用编译一次、跨线程共享的 Arc<Regex> 缓存,热路径里零子进程调用、纯 gix 完成 git 提交与打 tag。实测版本号 bump 全流程约 57 微秒,比原 Python CLI 快约一万倍;文章同时诚实指出,若只是单次内存内加一,纯 Python 的 re.compile+int 反而更快,真正的优势在于处理多文件、配置解析与 git 提交这类真实场景。
🔑 核心要点
- 核心痛点:作者凌晨发版时发现 bump-my-version CLI 把 0.1.0 加到 0.1.1 要花约 585 毫秒——对一个数字加一而言慢到荒谬,这才催生了重写冲动
- 真正的提速引擎是编译一次、跨线程复用的 Arc<Regex> 缓存,配合纯 gix 的 git 集成实现零子进程调用;实测完整 round-trip 约 57 微秒,比原 CLI 快约一万倍
- 诚实的权衡:纯 Python 的 re.compile + int() 在单次内存加一场景反而更快,因为约 50 微秒的 PyO3 FFI 开销会吃掉优势;Rust 版赢在多文件、配置解析、线程安全这类真实流水线
- 安全红线:#![forbid(unsafe_code)] 强制全程安全 Rust,唯一的 unsafe 落在 Node.js 的 napi-rs FFI 层,因原生插件互操作别无选择
- 修 borrow checker 的教训:把 Mutex<HashMap<String,Regex>> 换成 once_cell::sync::Lazy 初始化的线程本地 Arc<Regex>,编译立刻放行
💡 金句
如果你想把一个工具榨出一万倍性能,就得愿意走到不舒服的地方——那些凌晨四点让 AI 第七次重写你的正则缓存的黑暗角落。
👍 0
👎 0
← 返回 dev.to 首页