如何在 Isolates 之间共享已编译的 JS 代码

问题描述 投票:0回答:1

我有一个通过 Emscripten 编译的 1 MB JS+WASM 文件(例如,

xyz.js
),该文件充当库,由使用 V8 API 的 C++ 应用程序中的某些自定义 JavaScript 代码调用。

目前,我正在使用

xyz.js
加载
v8::String::NewFromUtf8
并使用
v8::Script::Compile
进行编译。
v8::String::NewFromUtf8
获取相应Isolate的句柄,这意味着我必须在调用此函数之前创建一个isolate。

问题是我需要在不同线程上并行运行多个隔离,并且必须在每个隔离中重新编译相同的文件,这会增加性能和内存开销。我希望能够做的是加载并编译该文件一次,然后在所有隔离区中共享它(类似于操作系统跨进程共享共享库的内存页面的方式)。

有什么办法可以实现这个目标吗?

PS。有一个 八年前的问题 询问同样的事情,但从那时起,V8 中可能添加了一些新功能。

javascript v8 webassembly emscripten
1个回答
0
投票

(这里是 V8 开发者。)

这一点没有改变。已编译的 JavaScript 代码是隔离特定的,不能跨隔离共享。这尤其是因为它包含隔离特定的指针(作为指令流中的立即数)。我们已经尝试过独立于隔离的优化代码,但结果发现速度慢得多,因此我们放弃了该实验。

编译后的 Wasm 代码 OTOH 在整个流程中共享。您无法直接控制它,但您可以在需要的地方实例化该模块,并相信 V8 将在幕后重用现有代码。郑重声明,这在未来可能会改变,也可能不会改变:我们计划试验一下,如果我们允许 Wasm 代码做出特定于隔离或特定于实例的假设,那么它能获得多快的速度。到目前为止,还不清楚这是否值得,但是新的生态系统开发,例如工具链,越来越多地使用模块分割,然后希望获得跨模块内联的性能优势,可能会改变这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.