预编译 v8 脚本以用于多个隔离
Posted
技术标签:
【中文标题】预编译 v8 脚本以用于多个隔离【英文标题】:Precompile v8 script for use in multiple isolate 【发布时间】:2015-03-30 04:18:59 【问题描述】:我已经使用嵌入式 v8 实现了一个类似“require”的函数,它加载一个 javascript 文件并执行它,但是因为我的程序有多个线程,因此每个线程都有自己的隔离,我必须加载和编译该文件分别在指定相同源的每个线程中。如果可能的话,我想以某种方式缓存任何已编译的脚本,以便如果另一个线程(使用另一个隔离)碰巧想要相同的文件,我可以利用某种预编译格式,并只给它运行脚本,而不是必须在需要相同文件的每个隔离内部单独编译它。
【问题讨论】:
目前还不清楚“嵌入式 v8”是什么(标签 wiki 不存在,所以那里没有帮助),但在标记为 C++(而不是 JavaScript)的问题中讨论 JavaScript 很少奇怪。请检查您的标签。你可能需要多解释一下你想要做什么——至少对于完全不在该地区的人来说,这很神秘。此外,您使用“隔离”,就好像它是该地区的人们都知道的术语;对于外界的人来说,这意味着什么并不明显。如果它是专家的行话,那可能并不重要,但也要回顾一下。 (应该是“线程”吗?) 我指的是直接从C++中使用Chrome v8,即嵌入式模式。 V8 是 google 的 javascript 引擎,Isolate 是针对每个引擎的上下文的。 @markt1964 - 您找到解决问题的方法了吗? 不,我没有。将来我可能会不再使用 v8 @JonathanLeffler v8 是一个使用 c++ API 嵌入到 c++ 应用程序中的 javascript 引擎。该问题已适当标记。它与javascript语言无关。如果您不理解某个问题,请继续。 【参考方案1】:我看不出这怎么可能,所有代码、脚本、SharedFunctionInfo 等都是特定于隔离的 JavaScript 对象。
但是,您可以构建某个 V8 状态的静态快照,并让所有隔离体始终加载该状态,但这不能动态地用于运行时。这就是 V8 内置函数的作用。
【讨论】:
不是我希望看到的答案,但我感觉它可能是。谢谢。 “隔离”之所以这样命名是有原因的。它是孤立的。跨隔离区预编译它是没有意义的,因为每个隔离区都是它自己的环境,并且看起来完全不同。从脚本中调用的函数可以解析为不同隔离中完全不同的东西。您是否真的看到了由于为每个隔离区进行编译而导致的问题,或者您是否过早地进行了优化? 随着我需要为每个隔离区编译的脚本数量的增加,使每个隔离区准备好在我的程序中使用所需的设置时间大致与其成正比。任何我还没有看到的性能问题我几乎肯定会看到脚本数量何时增长超过几个数量级。我相信解决方案是按照上述建议使用快照,尽管目前我不确定如何为多个脚本构建快照【参考方案2】:我认为 ScriptCompiler 可以帮助你。使用 ScriptCompiler::CompileUnboundScript,您可以为脚本创建和使用缓存数据。我没有(还)测试它,但评论看起来很有希望:
/**
* Compiles the specified script (context-independent).
* Cached data as part of the source object can be optionally produced to be
* consumed later to speed up compilation of identical source scripts.
*
* Note that when producing cached data, the source must point to NULL for
* cached data. When consuming cached data, the cached data must have been
* produced by the same version of V8.
*
* \param source Script source code.
* \return Compiled script object (context independent; for running it must be
* bound to a context).
*/
【讨论】:
以上是关于预编译 v8 脚本以用于多个隔离的主要内容,如果未能解决你的问题,请参考以下文章
如何使用预安装的 libv8 gem 和预编译的 v8 依赖项在 aarch64 上安装 therubyracer?