当asm.js比普通JS代码更快时,我为什么要在JS中编写新代码?

all*_*fox 10 javascript c c++ emscripten asm.js

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

我阅读了Emscripten FAQ,它说"通过各种方式编写新的JavaScript代码.",为什么会这样?

小智 12

asm.js不是执行Javascript-esque代码的更快的方法.这是一种更快的运行代码的方法,已经降低到机器代码的抽象级别.你似乎大大高估了收益:

  • 如果你让JS开发人员编写C++就好像它是JS一样,你最终会得到一些不像C++那么快的代码,并且在其他方​​面也存在缺陷.
  • 许多潜在的瓶颈,例如DOM操作和网络延迟,完全不受代码运行速度的影响.
  • 对于许多程序而言,从更快的语言实现加速相比,高级优化的速度相形见绌.换句话说,更快地完成工作很不错,但是根本不这样做会更快.

走这条路也有很大的缺点:

  • 你必须抛弃你的工作代码,然后用你所支持的大多数人都不会知道的语言重写它(包括错误),如果有的话.
  • 截至目前,该技术仍处于起步阶段.你不会打赌你的公司,甚至是重要的产品.即使它成功了,与JavaScript相比,它也将永远是一种利基技术.这不会是资格的专业工作,但它做很多事情更难.
  • IIUC,你不能直接做大多数事情JS可以做的超越数字,你只能调用JS函数显式提供给asm.js模块.也就是说,你总是需要在Javascript中至少有一堆粘合代码,并且(如上所述)如果这包括你的瓶颈,你实际上并没有获得任何东西.

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

  • 现有代码尚未用JavaScript编写.唯一的原因是为您节省了大部分移植麻烦.
  • 重数字运算没有与浏览器交互.(想一想:你经常这样做吗?你真的想要用C/C++编写它并用JS连接吗?)
  • 就其本质而言,在asm.js的抽象层面上支持的东西,例如发出机器代码 - esque指令的编译器.