将 JavaScript 数组有效地传递给 c/c++ 库并返回

Passing JavaScript array to c/c++ library and back efficiently

你好,基本上我想做的是将一个 JavaScript 数组传递给一个 c 模块函数,然后该函数就地修改数组,然后 JavaScript 读取修改后的数组。

目前的方法是使用 carrays.iarray_functions,创建 ArraydoubleArray 之间的转换,由于复制数组,它给我的结果比原生的差JS。我的阵列有大约 41000 个项目。

C模块:~10ms(实际C函数运行时间~0.1ms)

JS模块:~3ms

对我来说,不可能从一开始就使用 doubleArray(因为这是一个更大过程的一部分)。所以问题是我该如何改进它?可以使用TypedArray/ArrayBuffer吗?如果是那么怎么办?

以下是我的伪代码

let cArray = MyCModule.new_doubleArray(array.length),
    outArray = new Array(array.length);
arrayCopyJS2C(cArray, array);//written in JS and use a lot of time
MyCModule.MyCFunction(cArray, array.length);
arrayCopyC2JS(cArray, outArray);//also written in JS and use a lot of time

是的,使用 ArrayBuffer(具有外部化后备存储)是在 JavaScript 和 C 之间共享(数字)数组的有效方式,因为它不需要您复制内容大约。这是假设您可以在 JavaScript 侧使用 TypedArray "from the beginning";如果同样的限制适用于从一开始就使用 doubleArray 并且您仍然必须复制,那么好处将更小或不存在(取决于您访问 [=12= 的速度有多快) ]).

也就是说,V8 为数字数组的操作生成了高效的代码。我发现很难相信相同的函数在 JS 中需要 3 毫秒或在 C 中需要 0.1 毫秒。你能分享你的 JS 实现吗?如果 C 实现的速度是它的 30 倍,那么我敢打赌 JS 的实现可以得到很大的改进,从而非常接近它。数组操作通常主要取决于从内存中实际获取元素所花费的时间,并且没有语言在这方面具有特别的优势。