Pesquisa: parse_number() como uma extensão SQLite: C vs Rust
Eu estava passeando com o cachorro quando fiquei curioso sobre como seria fácil/difícil escrever uma extensão SQLite C que adicionasse um parse_number() função para girar cordas como -$1,234.56 ou '12.5%' em valores numéricos que podem ser somados e classificados.
Ativei o bate-papo normal do Claude (Opus 5.5) e perguntei:
I'm thinking about a SQLite custom function 'parse_number(value)' that strips ',', '$', '£' and '%', handles a leading '-', and returns 'NULL' for anything it can’t parse
Explore the difference between building this as a SQLite extension in C v.s. in Rust - I want to compare performance and code complexity and size of the resulting.então(or whatever) file
Isso me deu um ponto de partida sólido – a extensão Rust tinha 321 KB (usando Rusqlite) e 298 KB (usando sqlite-loadable-rs), enquanto a extensão C tinha 14 KB. Mas a extensão Rust foi mais rápida!
Acontece que isso ocorre porque o equivalente em Rust de C’s strtod é “duas vezes mais rápido”. Então eu perguntei:
Try writing your own C function for parsing text into a decimal number that catches up to or beats the Rust implementation
E aconteceu:
Custo líquido por linha acima de 2 milhões de linhas, quanto menor, melhor:
primeiro C novo C rusqlite carregável por sqlite Dados mistos 67 ns 19 ns 46 ns 41 ns Apenas números inteiros 25 ns 16 ns 36 ns 32 ns Somente decimais 106 ns 18 ns 55 ns 47 ns
Finalmente, fiz com que ele reescrevesse o protótipo como um relatório de pesquisa para corresponder aos outros em simonw/research, solicitando o seguinte:
Clone simonw/research from GitHub and turn your above investigation into a research report as seen in that repository - you can give me a zip file to download that contains your new folder
Aqui está o relatório resultante.






