我正处于一个项目的早期阶段,该项目旨在估算Javascript应用程序的功耗。通过Java字节码分析,Android应用程序也做了类似的工作,我希望在V8引擎中使用点火生成的字节码来应用类似的方法。但是,可以理解的是,似乎有更多的工具和资源可用于Java字节码的粒度分析。
我的问题是,在V8中是否有可能让引擎运行手工编码的字节码脚本来进行测试,而不是那些通过编译过程从实际JS源代码中生成的脚本。
这样做的原因是在字节码指令级别开发能源成本功能。为了实现这一点,我希望在连接到专用硬件的机器上的一个循环中重复运行相同的指令(或一组指令),以测量功率绘制。然后,通过分析V8生成的字节码的组成,这些测量将用于通知对程序总功耗的估计。
发布于 2022-05-25 13:15:00
(这里是V8开发人员。)
不,这不可能。
字节码是一个内部实现细节。它无意中没有外部接口(您无法从V8中获取它,也无法将它反馈回来),并且没有标准化或文档化--事实上,它随时都可能发生变化。
另外,字节码通常不会很好地执行,因为“热”函数会被分层(通过一组不断发展的编译器)。因此,虽然您可以创建一个人工的实验室设置,在那里您压力测试字节码的执行,这将是如此远离现实,我怀疑结果是否会非常有用。特别是,它们绝对不允许您对JavaScript程序的实际功耗做出任何有意义的声明。
测量JavaScript程序功耗的唯一方法是运行该程序,并在此过程中测量功耗。由于JavaScript的动态/灵活特性,没有像“每个+操作都使用X微焦耳,每个obj.prop加载都使用Y微焦耳”这样简单的静态规则。现实将是“视情况而定”。为了给出两个明显的例子,添加两个字符串与添加两个整数(时间和幂)有着不同的代价。单一形式的负载比大变形的负载便宜得多,加载简单的属性与必须遍历原型链并调用getter不同;优化可能完全可以避免负载,也可以避免加载,这取决于周围环境的不同。
https://stackoverflow.com/questions/72377482
复制相似问题