是否可以在 V8 引擎中执行手工编码的字节码脚本?

Is it possible to execute hand-coded bytecode scripts in the V8 engine?

我正处于一个旨在估算 Java 脚本应用程序功耗的项目的早期阶段。通过 Java 字节码分析对 Android 应用程序进行了类似的工作,我希望在 V8 引擎中使用 Ignition 生成的字节码来应用类似的方法。然而,可以理解的是,似乎有更多工具和资源可用于 Java 字节码的粒度分析。

我的问题是在 V8 中是否可以让引擎 运行 手动编码字节码脚本用于测试目的,而不是通过编译过程从实际 JS 源生成的字节码脚本。

这样做的原因是在字节码指令级别开发能量成本函数。为实现这一点,我希望 运行 在连接到专用硬件的机器上循环重复相同的指令(或指令集)以测量功耗。然后,这些测量值将用于通过分析 V8 生成的字节码的组成来估算程序的总功耗。

(此处为 V8 开发人员。)

不,这不可能。

字节码是一个内部实现细节。它有意没有外部接口(你不能从 V8 中取出它,也不能将它反馈回来),并且没有标准化或文档化——事实上,它随时都可能改变。

此外,字节码通常不会执行太多,因为“热”函数会分层(通过一组不断发展的编译器)。因此,虽然您 可以 创建一个人工实验室设置,您可以在其中执行 stress-test 字节码,但这与现实相去甚远,我怀疑结果是否非常有用。特别是,它们 绝对不会 允许您对 JavaScript 程序的实际功耗做出任何有意义的陈述。

测量 JavaScript 程序功耗的唯一方法是 运行 有问题的程序并在这样做时测量功耗。由于 JavaScript 的 dynamic/flexible 性质,没有像“每个 + 操作需要 X 微焦耳,每个 obj.prop 负载需要 Y 微焦耳”这样简单的静态规则。现实将是“视情况而定”。举两个明显的例子,将两个字符串相加与将两个整数相加具有不同的成本(在时间和功率方面)。单态加载比超态加载便宜得多,加载简单的 属性 与必须遍历原型链并调用 getter 具有不同的成本;优化可能会完全避免负载,也可能不会,这取决于各种周围环境。