返回资讯中心
外部精选
ai-models
#LLM#工程实践#c#research#sqlite#rust

开发者对比用 C 和 Rust 编写 SQLite parse_number() 扩展

来源标题:parse_number() as a SQLite extension: C vs Rust

开发者用 Claude 生成 SQLite parse_number() 扩展的 C 与 Rust 版本并对比。Rust 版体积为 298–321 KB、C 版仅 14 KB,但 Rust 版运行更快,原因是其 strtod 等价实现速度约为 C 的两倍;随后自定义 C 解析函数追平了 Rust 性能。

Simon Willison2026/11/8 · 今天4 分钟阅读

以下正文由 AI 翻译自 Simon Willison(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

研究:将 parse_number() 作为 SQLite 扩展:C 与 Rust 对比

我遛狗时突然好奇:编写一个 SQLite 的 C 扩展来添加 parse_number() 函数,把 -$1,234.56 或 '12.5%' 这类字符串转换成可求和、可排序的数值,这件事到底有多简单或有多难。

我打开普通的 Claude 聊天(Opus 5.5),输入了这样的提示:

我正在考虑做一个 SQLite 自定义函数 'parse_number(value)',它能去掉 ','、'$'、'£' 和 '%',处理开头的 '-',对无法解析的内容返回 'NULL'

请探究用 C 与用 Rust 分别构建这个 SQLite 扩展的差异——我想比较性能、代码复杂度,以及最终生成的 .so(或类似文件)的大小

这给了我一个不错的起点——Rust 扩展是 321 KB(使用 Rusqlite),用 sqlite-loadable-rs 则是 298 KB,而 C 扩展只有 14 KB。但 Rust 扩展更快!

原来这是因为 Rust 中与 C 的 strtod 等价的实现“快了两倍”。于是我提示:

试着写一个你自己的 C 函数,把文本解析成十进制数,要追平甚至超过 Rust 的实现

它做到了:

在 200 万行数据上每行的净开销,越低越好:

首次生成的 C 新生成的 C rusqlite sqlite-loadable 混合数据 67 ns 19 ns 46 ns 41 ns 仅整数 25 ns 16 ns 36 ns 32 ns 仅小数 106 ns 18 ns 55 ns 47 ns

最后,我让它把这个原型改写成一份研究报告中,以匹配 simonw/research 里的其他报告,提示如下:

从 GitHub 克隆 simonw/research,把你上面的调查写成该仓库中所见的那种研究报告——你可以给我一个 zip 文件下载,其中包含你的新文件夹

以下是最终生成的报告。

标签:c、research、sqlite、rust、claude

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →