【问题标题】:asm.js limits on the compilerasm.js 对编译器的限制
【发布时间】:2013-04-12 13:22:17
【问题描述】:

我想知道 asm.js 规范中是否有任何“设计限制”会阻止任何编译器直接从中生成本机汇编代码。

目前,firefox 的速度似乎是本机代码的一半,但我想知道为什么它不能以本机速度运行。在我看来,asm.js 很像 asm..

【问题讨论】:

    标签: javascript performance compiler-construction emscripten


    【解决方案1】:

    目前的限制是使用Typed Array 类型的 Javascript 作为内存(stackheap)。这是由于其他脚本与您的 asm.js 生成的 Javascript 交互,并且需要共享的“内存”空间。 此外我猜Typed Arrays 是作为实际堆内存实现的,这会比使用堆栈慢。

    【讨论】:

    • 但是知道你有 asm.js 也许你实际上可以使用Typed Array 的更方便的实现,比如实际使用堆栈..?
    • @Inuart 这可能会完成。问题是这是一项艰巨的任务,而且必须通过Typed Array 接口访问堆栈。因此,您至少将始终拥有该委托开销。
    • 你的意思是栈是类型化数组,javascript栈上好像运行的是常规代码?
    【解决方案2】:

    因为 Firefox 的编译器没有像 C 编译器那样对 asm.js 代码进行很多优化。 在 Windows 上,也是因为编译后的代码必须对数组访问执行边界检查(在其他操作系统上,Firefox 的 asm.js 编译器 OdinMonkey 使用内存保护)。

    【讨论】:

    • 所以你相信以 95% 的速度运行是可能的(比如在 NaCl 中)?
    • NaCl 代码可以使用 SIMD 指令,而 asm.js 没有。 (PNaCl 可能会有同样的问题。)Firefox 也不做自动矢量化。但是 asm.js 规范并不是最终的(甚至计划在 Firefox 22 达到 beta 时禁用 asm.js 支持,即 asm.js 代码在该版本中将被视为普通 JS)所以在未来,也许 asm.js 编译器会自动矢量化(目前还没有免费的编译器能做到这一点)或者 asm.js 会被扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多