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

时间:2017-03-17 00:38:34

标签: javascript node.js swig v8 node-gyp

基本上我想做的是将JavaScript数组传递给c模块函数,然后函数修改数组,然后JavaScript读取修改后的数组。

当前的方法是使用carrays.iarray_functions,创建和转换Array进出doubleArray并且由于复制数组,它给我的结果比本机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

1 个答案:

答案 0 :(得分:0)

是的,使用ArrayBuffer(使用外部化后备存储)是在JavaScript和C之间共享(数字)数组的有效方法,因为它不需要您复制内容。假设您可以从一开始使用TypedArray""在JavaScript方面;如果同样的限制适用于从一开始使用doubleArray并且您仍然需要复制,那么收益将更小或不存在(取决于您访问自己的速度有多快) doubleArray)。

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