【问题标题】:Streaming data into V8 / out of V8将数据流式传输到 V8 / V8 外
【发布时间】:2020-08-13 12:19:30
【问题描述】:

我有一个带有嵌入式 V8 引擎的 C++ 应用程序,我想使用 V8 使用 Javascript 灵活地转换数据。数据量可能很大,并且来自不同的文件格式,因此一次处理一条记录。如何使 V8 一次可以使用一条记录的数据?

我正在考虑的 2 个选项是通过访问器将 C++ 记录流作为 javascript 对象提供 - 但我不知道如何从 C++ 对象返回 ArrayBuffer。

我正在考虑的另一个选项是使用 v8-API 为每个新记录创建一个新的 ArrayBuffer 并将其绑定到相同的全局变量 - 以便脚本可以访问它。

将数据输入/输出的最佳/性能最好的方式是什么?

【问题讨论】:

    标签: v8 embedded-v8


    【解决方案1】:

    这真的取决于,有很多选择......

    您可以在 JavaScript 和嵌入之间共享一个长期存在的 (Shared)ArrayBuffer,以及一些通知机制。这样您甚至可以获得并发性:JavaScript 代码可以在一个线程中运行,嵌入器的其余部分在另一个线程中运行,并且您可以使用 Atomics 发出信号“请现在查看数组索引 x 到 y”,“好的,结果为 x通过 y are ready”等。至少在某些假设下,这很可能是性能最高的方法。

    您还可以分解您的 JavaScript 代码,这样您就只需为每条记录调用一次并返回结果的函数。这可能是最简单的方法,而且可能足够快。

    【讨论】:

    • 第二种方法(称为一次/记录)是我的目标——问题是如何将记录一个接一个地导入 V8?
    • 当 JavaScript 代码定义 function foo(x, y, z) {...} 时,您可以从嵌入代码中检索该函数(读取名为 foo 的全局对象属性),然后使用适当的参数调用它。您可以使用全局变量从外部写入,但由于无论如何您都必须调用该函数,因此将数据作为参数传递给调用似乎是最简洁的设计。 “过程”示例执行类似的操作:chromium.googlesource.com/v8/v8/+/master/samples/process.cc
    猜你喜欢
    • 2017-02-09
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多