一分钟读论文:《我们走了多远——WebAssembly 运行时的全面特征研究》

119 阅读2分钟

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,⽽它们的缓存未命中率通常相似。

推荐阅读:《我们走了多远——WebAssembly 运行时的全面特征研究》