3 个版本 (破坏性)
0.2.0 | 2022年11月9日 |
---|---|
0.1.0 | 2022年11月3日 |
0.0.1 | 2022年10月21日 |
在 #dom 中排名第 147
105KB
2K SLoC
sledgehammer
一点一滴打破 WASM<->JS 性能界限
状态:墙上有一些漏洞。
什么是 Sledgehammer?
Sledgehammer 通过批处理对 js 的调用,为 DOM 操作提供了更快的 rust 绑定。
基准测试
-
js-framework-benchmark,它信任实现并仅测量 DOM 操作时间(不测量绘制时间):https://demonthos.github.io/wasm_bindgen_sledgehammer/ 由于排除了绘制时间的差异,因此它比官方 js-framework-benchmark 给出更一致的结果。因为 sledgehammer 和 wasm-bindgen 实现导致相同的 DOM 调用,它们应该有相同的绘制时间。
这与 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