出处是 Zach 那篇讲他怎么把 KeyEcho 推到 1.0 的文章。原 PR 是 130 个文件,11,405 行加,9,292 行删——一个桌面键盘声音 app,两年攒了 800 多颗星,1.0 就敢这么改,我差点当陈年重构划过去。这个量级,大部分是搬家,不是真活儿。
作者在 PR 描述里最先写的不是性能数字,是这句:
所有音频切片在选音效包时预解码一次,击键时不解码。
我稍微坐直了。大部分优化文章说不清「搬没搬出热路径」,他这句干净。你选完音效包,所有切片都解码完了,后面按一次键,只是一个 Arc 引用。全局 mutex 没了,换成一个 ArcSwapOption 加一个 AtomicU32。这本身是旧活,但 benchmark 真下去了:cache 命中从 1,184 ns/op、每次拷 66 KiB,变成 43 ns/op、零拷贝。最大的 cache 切片 38 倍。搬得确实在热路径上。
切片去重,同一个声音只解码一次,Arc 共享,不复制 sample。内存有上限,击键队列 bounded,每个音效包 10 MiB 解码预算。这几个放在一起,那些 benchmark 才可信——没拿内存换速度,至少他记账是这么记的。
作者列了 AI 帮了什么:Tauri 1 到 2 迁移,逐行过热点路径,排序 issue backlog。还说让 Rust 借用检查器和类型系统当 AI 代码的第一个 reviewer,能抓别名和 Send/Sync 错误。这句我不全信。
Rust 编译器抓 AI 生成代码的 Send/Sync 错,我信。逐行审热点?从他刚才那份 benchmark 看,我更觉得 AI 只是陪跑。真正有声色的在后面——AI 提了个补丁,作者没合。
事很小。GitHub Actions 里 Linux armv7 构建红了。AI 说,把 git-pinned 的音频 crate 换成 crates.io 上的正式版,CI 就过。建议本身没错,红色没了多清爽。但作者没交。
那个 pin 锁的是 cpal 0.18,不是随便一个 commit。它保着一个用户点出来的行为:拔了耳机、切了蓝牙音箱,声音自己跟过去。东西在 issue #41 和 #20 里。crates.io 那个版本是 cpal 0.17.3——换上去 CI 绿了,设备跟随没了。这不是修,是拿一个功能换一次构建。最阴的是,这次降级是静默的:编译过,测试过,release 都出。谁也不会发现少了一个只在某个版本文档里写清的行为。
我读到这还是有点后怕。换成我,深夜看见 QEMU 上 armv7 红了一排,AI 又说「换成正式版就行」,我大概率 checkout 补丁扫一眼 diff,看不出大毛病就合了。作者没合,因为那个 pin 是另一个特性的地基。
最后修法没意思,土。cargo vendor 捆依赖,QEMU 里离线构建,pin 不动。然后干脆把 Linux armv7 从 1.0 里删了。模拟构建要两小时,又没几个 32 位 ARM 用户,留它干嘛。这个决定 AI 提不出来,成本是作者自己量的。
他把自己的用法说得很清楚:Claude Fable 开脑洞,出非线性的思路;GPT-5.6 当执行,把定好的方案写成接近完美的代码。我见过不少 vibe 教徒的用法总结,没这么老实。最省事是把开脑洞和执行都丢给同一个东西,拿回来的代码「看起来能跑」,但你不确定哪部分是脑子,哪部分是打字。他这个分法,等于脑子留自己手里。
我再说难点听。AI 能写出 130 文件的 PR,也能在 CI 红的时候给你一个最职业的修法。所以那个被拒掉的补丁,比我前面报的所有性能数字都更值得点。
他还说了一句让我不太舒服但更信的话。评论里他写,尾延迟在突发负载下没测,设备跟随也没有行为测试兜底。写这种大 PR 的人一般会在「38x、zero copy」后面顺手补一句“已全面验证”。他不,他说没测就是没测。所以他前面那些数字是「我知道这条线在哪」的基准,不是吹的。
KeyEcho 现在还是 AGPL-3.0 免费开源,Tauri 2,SolidJS,Windows 签名、mac 公证,release 页都对得上。这条我没法跑,只读了。一个桌面键盘音效,我总不能为了验证在 mac 上装 Rust 工具链天天戳按键。
不点链接也能带走一句:版本 pin 不见得是代码里最丑的部分,它可能只是一个用户在 issue 里嚷嚷过的功能,给某个版本号上的保险。AI 想拆那根保险,作者没让。
