#dom #web #api-bindings

sledgehammer

DOM 操作的快速绑定

3 个版本 (破坏性)

0.2.0 2022年11月9日
0.1.0 2022年11月3日
0.0.1 2022年10月21日

#dom 中排名第 147

MIT 许可证

105KB
2K SLoC

Rust 1.5K SLoC // 0.0% comments JavaScript 701 SLoC // 0.1% comments

sledgehammer

一点一滴打破 WASM<->JS 性能界限

状态:墙上有一些漏洞。

什么是 Sledgehammer?

Sledgehammer 通过批处理对 js 的调用,为 DOM 操作提供了更快的 rust 绑定。

基准测试

这与 wasm-bindgen/web-sys 相比如何

wasm-bindgen 比大锤更通用,使用起来也更方便。它具有许多大锤没有的 API 绑定。对于大多数用户来说,wasm-bindgen 是更好的选择。大锤专门设计用于需要底层快速访问 DOM 的 Web 框架。

为什么它这么快?

字符串解码

  • 解码字符串代价很高,但代价不会随着字符串大小而改变很多。wasm-bindgen 对每个字符串调用 TextDecoder.decode。Sledgehammer 只在每批中调用 TextEncoder.decode 一次。

  • 如果字符串很小,则可以在 JavaScript 中解码字符串以避免 TextDecoder.decode 的常数开销。

  • 请参阅这个基准测试: https://jsbench.me/4vl97c05lb/5

单字节属性和元素

  • 除了使字符串解码更便宜外,Sledgehammer 还使用更少的字符串。所有元素和属性名称都编码为单个字节,然后在 JavaScript 解释器中转换回字符串。

  • 为了允许自定义元素和属性,您可以使用 &str 而不是 Attribute 或 Element 枚举。

字节编码操作

  • 在 Sledgehammer 中,每个操作都编码为字节序列,这些序列打包到数组中。每个操作需要 1 个字节加上所需的数据。

  • 布尔值作为操作字节的一部分进行编码,以减少读取的字节数。

  • 每个操作以 u32 批量编码为四个。从数组缓冲区获取数字的成本很高,但获取 u32 而不是 u8 的成本并不更高。Sledgehammer 读取 u32,然后将其拆分为 4 个单独的字节。

  • 查看这个基准测试:https://jsbench.me/csl9lfauwi/2

最小化传递ID

  • 对于Web框架执行的一组常见操作是在克隆DOM节点后遍历它们。sledgehammer允许您在创建或导航到的最后一个节点上执行操作,而不是为每个节点分配一个ID。这意味着遍历ID的操作只需占用一个字节,而不是5个字节。

依赖项

~6.5–8.5MB
~170K SLoC