当asm.js比普通JS代码快的时候,我为什么要用JS写新代码呢?

When asm.js is faster than normal JS code, why should I write new code in JS?

本文关键字:代码 JS 为什么 新代码 js asm      更新时间:2023-09-26

Emscripten可以从C/c++生成比手工编写JS代码更快的代码,所以这是否意味着我们应该用C/c++编写新的代码并编译它们在Web上运行?

我读了Emscripten FAQ,上面写着"无论如何要写新的JavaScript代码",为什么?

asm.js不是执行javascript风格代码的更快方式。它是运行代码的一种更快的方式,这些代码已经被降低到机器代码的抽象级别。你似乎大大高估了收益:

  • 如果你让JS开发者把c++写得像JS一样,你最终会得到丑陋的代码,它远不如c++那么快,而且在其他方面也有缺陷。
  • 许多潜在的瓶颈,如DOM操作和网络延迟,根本不受代码运行速度的影响。
  • 对于许多程序,更快的语言实现的速度与高级优化的速度相比相形见绌。换句话说,把工作做得快一点是好的,但什么都不做反而更快。

走这条路也有明显的缺点:

  • 你必须抛弃你的工作代码,并重新编写它(包括bug)的语言,大多数你的团队几乎不知道,如果有的话。
  • 截至目前,该技术仍处于起步阶段。你不会把你的公司,甚至是一个重要的产品押在上面。即使它成功了,与JavaScript相比,它也永远是一个小众技术。这并不会使它失去专业工作的资格,但它会使许多事情变得更加困难。你不能直接做JS能做的大部分事情,除了处理数字,你只能调用JS中显式提供给asm.js模块的函数。也就是说,在Javascript中至少需要一堆粘合代码,而且(如上所述)如果这包含了瓶颈,那么实际上您并没有获得任何东西。

我希望从asm.js中获得足够的代码类型是:

  • 未在JavaScript中编写的现有代码。唯一的原因是为您节省了大部分移植麻烦。
  • 大量的数字运算不与浏览器交互。(想想:你多久做一次这样的事?你真的想花时间用C/c++编写它,然后用JS连接吗?)
  • 本质上属于asm.js支持的抽象级别的东西,比如编译器发出机器代码式指令。