2

在查看了最近宣布的对 WebAssembly 的支持后,我突然想到,如果有一些方法可以显着提高它的效用:

  1. 让 TurboFan(V8 JIT Crankshaft 优化器的继任者)输出它生成的所有汇编代码以及静态类型签名和生成代码的执行配置文件。

  2. 允许程序员为覆盖优化器的特定静态类型签名提供自己的 asm.js/WebAssembly 代码。

有没有办法做到这一点?

有一些迹象表明它可能来自本文的以下段落:

在底层,V8 中的 WebAssembly 实现旨在重用大部分现有的 JavaScript 虚拟机基础设施,特别是 TurboFan 编译器。一个专门的 WebAssembly 解码器通过一次检查类型、局部变量索引、函数引用、返回值和控制流结构来验证模块。解码器生成一个 TurboFan 图,该图经过各种优化处理,最终由同一后端转换为机器码,该后端为优化的 JavaScript 和 asm.js 生成机器码。在接下来的几个月里,团队将专注于通过编译器调优、并行性和编译策略改进来改善 V8 实现的启动时间。

为更广泛的受众扩展这个想法:

典型的自上而下优化涉及高级编程,然后执行分析以确定哪些代码需要更多的努力。无论优化是自动代码生成还是优化代码的手动编码,都是如此。在动态类型语言的情况下,您经常希望超越仅仅优化动态类型算法并提供专门用于特定静态类型的代码。事实上,这就是 V8 JIT 优化器自动执行的操作。如果人们想手动提供一些特别“热门”的专门案例,他们需要以某种方式通知自动优化器他们已经完成了工作,以便自动优化器可以合并手动优化的代码,而不是自动生成次优代码。

4

2 回答 2

1

不,这是不可能的,而且永远不可能,因为它可能需要突破系统内的各种抽象障碍。复杂性将是巨大的,并且对可维护性和安全性的影响可能会很严重。

WebAssembly 模块的 Web 界面(通过Wasm对象)提供了一种简洁的方式来连接 JS 和 Wasm。将来,ES6 模块可能会进一步简化互操作。像您提出的复杂机制相比于它有什么优势尚不清楚。

于 2016-03-16T18:40:02.973 回答
1

对于 1. 您可以使用以下标志:

  • trace_turbo: 跟踪生成的 TurboFan IR
  • trace_turbo_graph: 跟踪生成的 TurboFan 图
  • trace_turbo_cfg_file: 将 turbo cfg 图(用于 C1 可视化器)跟踪到给定的文件名
  • trace_turbo_types: 追踪 TurboFan 的类型
  • trace_turbo_scheduler: 跟踪 TurboFan 的调度器
  • trace_turbo_reduction: 追踪 TurboFan 的各种减速器
  • trace_turbo_jt: 跟踪 TurboFan 的跳转线程
  • trace_turbo_ceq: 跟踪 TurboFan 的控制等价性
  • turbo_stats: 打印 TurboFan 统计信息

它们可能会在未来的 V8 版本中发生变化,并且不是稳定的 API。

TurboFan 相当复杂,因为它使用来自基线 JIT / 解释器的信息,并且可能在 deopt 后获取该信息。编译器并不总是从 JS / wasm 到汇编的直接管道。内联和其他一些事情会影响发生的事情。

对于 2.:首先编写 wasm 代码或有效的 asm.js。

我们已经讨论了执行一系列不同类型的动态跟踪、缓存跟踪(并允许注入跟踪以进行测试),但考虑到已经有一种方法可以为编译器提供精确的类型信息,这可能不是我们要公开的事情!

于 2016-03-16T18:37:44.857 回答