首页 > 解决方案 > WebAssembly 的功能大吗?

问题描述

Emscripten 有一个标志OUTLINING_LIMIT来获得可以通过浏览器的 JIT 优化的更小的函数,这与需要解释的大型函数不同。这是否也适用于 WASM,从某种意义上说,具有大功能的 WASM 会更慢吗?

标签: javascriptemscriptenwebassembly

解决方案


您引用的文档对于 WebAssembly 的当前实现是不准确的。现在只有 Chakra 有解释器,任何“热”函数都会被 JIT 编译,无论大小。WebAssembly 的 JavaScriptCore 实现仅进行 JIT 编译,并且“热”函数在更高的优化级别上重新编译。

话虽如此,大纲有几个优点:

  • .wasm二进制文件可以变得更小。这意味着它下载速度更快。
  • 理论上,如果我们开始在 Web 上大量看到引擎,引擎可以重新内联小型轮廓函数,因此您不会因为轮廓而损失性能。
  • 大型函数有时需要更长的时间进行 JIT 编译,通常编译是非线性的(尽管引擎会随着时间的推移而变化,并且如果这成为一个普遍存在的问题,可以更好地处理大型函数)。
  • 引擎通常在每个函数的边界上并行编译,因此更多的小函数可以更好地并行编译并更多地填满编译管道(特别是在编译结束时,如果你只剩下几个大函数来编译你的内核,那就不会了不能使用)。这是一个很小的问题,我不会太担心。

然而,所有这一切都在不断变化,引擎实现者会对我们在 Web 上看到的内容做出反应,并调整引擎以更好地处理现实世界的代码。做正确的事通常是件好事,如果您发现问题,请在每个引擎上提交错误。这可能意味着通过使用大纲来减少下载大小,并期望发生良好的重新内联。


推荐阅读