WebAssembly 的大函数速度慢吗?

Is WebAssembly slow with big functions?

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

您引用的文档对于当前的 WebAssembly 实现不准确。现在只有 Chakra 有解释器,任何 "hot" 函数都可以通过 JIT 编译,无论其大小如何。 WebAssembly 的 JavaScriptCore 实现仅进行 JIT 编译,并且 "hot" 函数以更高的优化级别重新编译。

话虽这么说,大纲有几个优点:

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

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