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

时间:2013-05-13 16:50:41

标签: javascript c++ c emscripten asm.js

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

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

1 个答案:

答案 0 :(得分:12)

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

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

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

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

我期望从asm.js中获得的唯一代码类型是:

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