WebAssembly ⼆进制⽂件依赖 Web 浏览器的 JavaScript 引擎来执⾏,需要独⽴的 WebAssembly 运⾏时才能在⾮ Web 浏览器中运⾏ WebAssembly 代码。美国佐治亚大学的论文《我们走了多远——WebAssembly 运行时的全面特征研究》构建了一个标准的 WABench 的基准套件,对独立的 WebAssembly 运行时进行了全面的表征研究,包含性能、内存开销和架构特征。分析了33 个独⽴ WebAssembly 运⾏时
的TOP5,发现这些独立运⾏时在运⾏ WebAssembly ⼆进制⽂件时平均会降低 1.59 到 9.57 倍的性能
。
- 与原生执行相⽐,所有五个独⽴的 WebAssembly 运⾏时在执⾏ WebAssembly ⼆进制⽂件时都会引⼊额外的性能开销。平均性能下降范围从
1.59× (Wasmer) 到9.57× (WAMR)
。 - 在三个 WebAssembly JIT 编译器中,Cranelift 和 LLVM 对于不同的基准程序集具有最佳性能。与 SinglePass 相⽐,Cranelift 的性能平均提速为
1.74×
,⽽ LLVM 的提速为1.43×
。 - AOT 编译对 WAVM 的性能(
1.73×性能加速
)有很⼤影响,⽽对 Wasmtime (1.02×加速
)和 Wasmer(1.02×加速
)的影响⾮常有限。 - WebAssembly 编译器优化可以为不同的 WebAssembly 运⾏时带来相当⼤的性能改进,性能加速
1.44× ‒ 3.57×
。 - 运⾏ WebAssembly ⼆进制⽂件时,独⽴ WebAssembly 运⾏时消耗的内存资源是原生执⾏的
1.26x‒ 5.50x
。 - WebAssembly 运⾏时不仅执⾏更多的机器指令,即平均为原生执⾏的
2.03x‒ 14.61x
,⽽且还表现出⽐原生执⾏更⾼的每周期指令(Instructions per cycle, 即 IPC)值。 - WebAssembly 运⾏时表现出⽐原生执⾏更多的分⽀预测未命中率,范围从
1.52× 到 12.64×
,但它们的分⽀预测未命中率通常⾮常接近原生执⾏
。 - 与原生执⾏相⽐, WebAssembly 运⾏时的
平均缓存未命中率为1.39x⾄4.60x
,⽽它们的缓存未命中率通常相似。