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

Posted

技术标签:

【中文标题】当 asm.js 比普通的 JS 代码快时,我为啥要在 JS 中编写新代码?【英文标题】:When asm.js is faster than normal JS code, why should I write new code in JS?当 asm.js 比普通的 JS 代码快时,我为什么要在 JS 中编写新代码? 【发布时间】:2013-05-13 16:50:40 【问题描述】:

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

我阅读了 Emscripten 常见问题解答,上面写着“无论如何都要编写新的 javascript 代码。”,这是为什么呢?

【问题讨论】:

除非你能真正感受你的 JS 和 asm.js 之间的区别,否则不要接触 C++。 很少有 JavaScript 实际上“做”到足以产生任何影响。当然,有些 javascript 需要一些时间来完成它的工作,并且有些编写不好的 javascript 需要很长时间才能运行。但是编译它并不能真正解决后者。 @allfox 你在这里混合了两件事。 1. 从 C/C++ 到 Javascript 的交叉编译可能会更快 2. 使用 asm.js 而不是 Javascript 几乎总是会更快。但是你想知道前者还是后者? 【参考方案1】:

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

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

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

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

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

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

【讨论】:

我鼓励勇敢的人尝试探索任何 3d 演示代码中的 js。完全无法理解。

以上是关于当 asm.js 比普通的 JS 代码快时,我为啥要在 JS 中编写新代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Firefox 是不是使用 asm.js 代码?

tftp,传送速度时快时慢,为啥?

使用 asm.js 将依赖于外部库的代码转换为 javascript

从 Asm.js/emscripten 启用 WebGL 扩展?

为啥向量长度 SIMD 代码比普通 C 慢

无效的 asm.js:stdlib 的无效成员