2013-05-13 52 views
10

Emscripten可以从C/C++生成比JS代码更快的代码,这是否意味着我们应该用C/C++编写新代码并编译它们以便在Web上运行?当asm.js比正常的JS代码更快时,为什么我应该在JS中编写新代码?

我阅读了Emscripten FAQ,它说:“通过所有手段编写新的JavaScript代码”,为什么?

+2

除非你真的能感觉到你的JS和asm.js之间的区别,否则不要碰C++。 – DCoder 2013-05-13 16:51:52

+0

很少有JavaScript实际上“做得”足以让任何区别。当然,有一些JavaScript需要一些时间来完成它的工作,并且有一些写得很糟糕的JavaScript需要很长的时间才能运行。但编译它并不能真正解决后者。 – 2013-05-13 16:54:21

+0

@allfox你在这里混合2件事。 1.从C/C++到Javascript的交叉编译可能会更快,2.通过Javascript使用asm.js几乎总是会更快。但是你想知道前者还是后者? – abergmeier 2013-05-14 15:31:41

回答

12

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

  • 如果让JS开发人员编写C++,如果是JS,你最终的fugly代码几乎一样快并不像C++可以和其他方面的缺陷了。
  • 许多潜在的瓶颈,如DOM操作和网络延迟,完全不受您的代码运行速度的影响。
  • 对于许多程序来说,由于高级优化的加速,加速语言实现的速度变得越来越慢。换句话说,以更快的速度完成工作是件好事,但完全没有做得更快。

走这条路有显著缺点还有:

  • 你必须扔掉你的工作代码,并在语言大部分的团队赢得了”重新写(包括缺陷)如果有的话,几乎也是如此。
  • 截至目前,该技术还处于起步阶段。你不会赌你的公司,甚至是重要的产品。即使成功,与JavaScript相比,它始终是一项利基技术。这并不妨碍它的专业工作,但它使许多事情更难。
  • IIUC,你不能直接做大多数JS可以做的事情,除了数据处理之外,你只能调用显式提供给asm.js模块的JS函数。也就是说,你总是需要在JavaScript中至少有一堆胶水代码,并且(如上所述),如果这包括你的瓶颈,你实际上并没有获得任何东西。

唯一种代码,我期望从asm.js获得足够的使用是:

  • 现有这是不是已经用JavaScript编写代码。为了节省大部分移植麻烦的唯一原因。
  • 沉重的数字运算不与浏览器交互。 (想想:你多久做一次这样的事情?你真的想要通过使用C/C++编写它,并用JS连接它的努力吗?)
  • 从本质上讲,抽象asm.js支持,例如发布机器代码式指令的编译器。
+1

我会鼓励勇敢的尝试在那里的任何3d演示代码中探索js。完全无法理解。 – meawoppl 2014-03-03 05:42:50

相关问题