Home
I make a no-CGO Go SQLite driver, by compiling the amalgamation to Wasm, then loading the result with wazero (a CGO-free Wasm runtime).<p>To compile SQLite, I use wasi-sdk, which uses wasi-libc, which is based on musl. It's been said that musl is slow(er than glibc), which is true, to a point.<p>musl uses SWAR on a size_t to implement various functions in string.h. This is fine, except size_t is just 32-bit on Wasm.<p>I found that implementing a few of those functions with Wasm SIMD128 can make them go around 4x faster.<p>Other functions don't even use SWAR; redoing <i>those</i> can make them 16x faster.<p>Smooth sort also has trouble pulling its own weight; a Shell sort seems both simpler and faster, while similarly avoiding recursion, allocations and the addressable stack.<p>I found that using SIMD intrinsics (rather than SWAR) makes it easier to avoid UB, but the code would definitely benefit from more eyeballs.<p>See this for some benchmarks on both x86-64 and Aarch64: <a href="https://github.com/ncruces/go-sqlite3/actions/runs/14516931864">https://github.com/ncruces/go-sqlite3/actions/runs/145169318...</a>
6 comments
fuhsnnabout 1 month ago
Wasm intrinsics look neat as a higher-level fixed size SIMD abstraction. I wonder how good the compilers can do if using them for AOT targets with libraries like simd-everywhere.<p>string.h is missing strstr(), there's an algorithm of similar complexity you might consider: <a href="http://0x80.pl/notesen/2016-11-28-simd-strfind.html" rel="nofollow">http://0x80.pl/notesen/2016-11-28-simd-strfind.html</a>
评论 #43731344 未加载
phickeyabout 1 month ago
This looks like a nice approach to making wasi-libc faster. Could you submit these changes upstream?
评论 #43730651 未加载
cedwsabout 1 month ago
Would you consider writing some blog posts or other resources about WASM? I was experimenting recently with WIT, and ran into a mountain of issues. There's a lot of jargon that could do with some untangling.<p>It took me a lot longer than it should have to put together this basic module, and even then there's this shared library I had to download to build it, and I couldn't figure out why this requires a libc:<p><a href="https://github.com/cedws/wasm-wit-test">https://github.com/cedws/wasm-wit-test</a>
评论 #43737586 未加载
tuananhabout 1 month ago
very cool project.<p>it's kinda frustrating to compile sqlite for wasm. can be done but quite troublesome.
nu11ptrabout 1 month ago
It is still a bit early, but I'm majorly bullish on WASM for multiple use cases:<p>1. Client side browser polyglot "applets" (Java applets were ahead of their time IMO)<p>2. Server side polyglot "servlets" (Node.js, embedded runtimes, etc.)<p>3. Language interop/FFI (Lang A -> WASM -> Lang B, like wasm2c)<p>Why is #3 so interesting? The hardest thing in language conversion is the library calls. WASI standardizes that, so all the proprietary libs will eventually compile down to WASI as a sort of POSIX/libc like layer. In addition, WASM standardizes calling convention. The resulting new source code may not look like much, but it will solve the FFI calling convention/marshalling/library issues nicely.
评论 #43731316 未加载
评论 #43731214 未加载