WebAssembly是否因为大功能而变慢?

时间:2018-05-01 07:00:34

标签: javascript emscripten webassembly

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

1 个答案:

答案 0 :(得分:4)

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

话虽如此,概述有一些优点:

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

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