samwillis 4 hours ago

It's great that the rust community are finding ways to improve the performance of decoding strings from WASM to js, it's one of the major performance holes you hit when using WASM.

The issue comes down to the fact that even if your WASM code can return a utf16 buffer, to use it as a string in JS code the engine needs to make a copy at some point. The TextDecoder api does a first good job of making this efficient, ensuring there is just a single copy, but it's still overhead.

Ideally there should be a way to wrap an array buffer with a "String View", offloading the responsibility of ensuring its utf16 to the WASM code, and there being no copy made. But that brings a ton of complexities as strings need to be immutable in js, but the underlying buffer could still be changed.

  • breve 2 hours ago

    The JS string built-ins proposal for WebAssembly:

    https://github.com/WebAssembly/js-string-builtins/blob/main/...

    • samwillis 7 minutes ago

      Personally I feel this is backwards - I don't want access to js literals and objects from WASM, I just want a way to wrap an arbitrary array buffer that contains a utf16 string as a js string.

      It keeps WASM simple and provides a thin layer as an optimisation.

andyferris 4 hours ago

The whole UTF-8 vs UTF-16 thing makes this way more messy than it should be.

I'd love for some native way of handling UTF-8 in JavaScript and the DOM (no, TextEncoder/TextDecoder do not count). Even a kind of "mode" you could choose for the whole page would be a huge step forward for the "compile native language to WASM + web" thing.

  • ethan_smith 3 hours ago

    The TC39 proposal for "Resizable ArrayBuffer" and "String.prototype.isWellFormed" methods are steps in this direction, though we still need proper zero-copy UTF-8 string views.

  • theSherwood 4 hours ago

    100%. If we could get a DomString8 (8-bit encoded) interface in addition to the existing DomString (16-bit encoded) and a way to wrap a buffer in a DomString8, we could have convenient and reasonably performant interfaces between WASM and the DOM.

    • continuational 3 hours ago

      The extra DOM complexity that would entail seems like a loss for the existing web.

CyanLite2 4 hours ago

Sad that this isn’t natively in browsers…

bcardarella 4 hours ago

How does the performance compare to projects like Wasmtime?

  • Evan-Almloff 4 hours ago

    The two projects have different usecases so they can't be directly compared. Slegehammer bindgen makes calling javascript from rust faster in the browser. Wasmtime is a native runtime for WASM outside of the browser