当您用 Rust 编写一个函数并在 JavaScript 文件中调用它时,究竟会发生什么?

What exactly happens when you write a function in rust and call it in the a JavaScript file?

显然,使用 Rust 和 wasm 制作 Web 应用程序可以使其 运行 更快。你的 rust 代码使用 webassembly 作为编译目标,你的 rust 代码被编译成 webassembly,这个 webassembly 在浏览器的 web assembler 机器中是运行,如果我错了请指正

您可以编写 Rust 函数并将它们称为 JavaScript 文件。这会调用你的 rust 函数变成的 web assembly 代码吗?

Apparently making a web application using rust and wasm make it run faster.

性能取决于很多事情,“只是用 wasm 做”并不能神奇地改善事情。事实上,有两个主要方面可能会造成麻烦:

  • WASM 二进制文件往往比等效的 JS 更大。这可以通过压缩和仔细的编译器标志在一定程度上缓解,但由于您的网站在加载代码之前将无法运行,因此它是 trade-off。如果你需要做某事,WASM 会获胜 heavy/repeatedly.
  • WASM 和 JS 之间的调用无法内联。 (这有时会导致对预期性能的误解,例如: - the performance of calls has been improved, but it still doesn't ccome close to inlining for small functions.) On top of that, WASM doesn't 提供对 HTML DOM 的直接访问,您需要通过 JS。因此,如果您的代码主要执行 DOM修改,WASM输。

恕我直言,一个相对有趣的 WASM 性能案例研究是 source-map。它进行一些相对繁重的字符串解析。

  1. 它在 Rust/WASM 中被 first 重写以显着提高性能
  2. Then 一位 JS 性能的绝对大师出现了,并表明在 JS 中也可以达到相同的性能(但肯定不是在惯用的 JS 中。-鉴于 asm.js 的存在,这是不足为奇。)
  3. Finally,将2.中展示的一些技术移植到Rust,最终让WASM版本在速度上略有优势。

那么结论是什么?如果您有一些繁重的计算而恰好难以针对 JS 引擎进行优化,WASM 可能会为您提供更好的性能。 为了进一步阅读,this 系列很好地概述了 WASM 的原因、方式和期望。