#optimization #js #asm #rewrite #emscripten #registerize-harder

nightly bin+lib ayzim

Aydian Hobson Sayers 编写的 Rust 对 Emscripten asm.js 优化器的重写

3 个版本

使用旧 Rust 2015

0.1.2 2016 年 11 月 5 日
0.1.1 2016 年 11 月 4 日
0.1.0 2016 年 11 月 4 日

#17#emscripten

MIT/NCSA

395KB
8K SLoC

Rust 6.5K SLoC // 0.1% comments JavaScript 2K SLoC // 0.0% comments Shell 111 SLoC // 0.1% comments

Ayzim

嗨,zim!

Ayzim 是 Emscripten asm.js 优化器(以下简称 'Emopt')在 Rust(从 C++)中的重写。它应该是一个即插即用的替换品,尽管您可能会观察到一些细微的差异——Ayzim 在选择浮点表示方面略胜一筹,Emopt 至少有一个几乎可以忽略的优化模式比 Ayzim 更好。在重写过程中,我们修复了 Emopt 的一些错误(大部分已回馈),并清理了一些东西。与任何非平凡的改写一样,它可能存在一些错误,但庞大的 Emscripten 测试套件没有报告任何重大问题,因此应该是相当正确的。

Ayzim 比 Emopt 消耗的内存显著减少——根据我运行的遍历,我看到了 2 倍到 6 倍的减少(当内存使用量较大时,减少倍数更高)。鉴于 Emopt 可以达到 > 7GB 的内存,如果一次尝试优化一个大型 .js 文件,那么 6 倍的减少是非常有用的(注意,Windows 用户应该看到更大的改进,因为 Emopt 由于 MSVC 编译器中缺少一些功能而受到影响)。Ayzim 还意外地稍微快一点——在 -O2(使用 registerize 时)快约 25%,在 -O3(使用 registerizeHarder 时)快约 50%。通常,asm.js 优化器并不是整体构建中的主要因素(它可能只是链接阶段的 25%),所以这并不是特别令人兴奋。

重写 ayzim 的原始动机是在尝试优化可能是迄今为止生成的最大的 asm.js 文件(约 700MB)时保持我的机器可用。如果允许它并行运行(默认行为),内存消耗会导致我的桌面环境交换,这很烦人。显然,正确的解决方案是重写 Emopt,而不是仅仅购买一台新机器 :)

未来

  • 使其作为库更有用
  • WASM

依赖项

~2MB
~39K SLoC