【问题标题】:Passing JavaScript array to c/c++ library and back efficiently将 JavaScript 数组传递给 c/c++ 库并有效地返回
【发布时间】:2017-08-08 09:41:41
【问题描述】:

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

当前的方法是使用carrays.iarray_functions,创建ArraydoubleArray 并从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

【问题讨论】:

  • 为什么不用原生JS?往返服务器听起来对我来说是一个薄弱环节。
  • 你试过在 JavaScript 中使用Float64Array 吗?
  • 为什么要复制数组?为什么要在 JS 中这样做?
  • @Taylor 因为我想提高运行时间
  • @Bergi 是的,尝试过Float64Array,它是缓冲区(MyFloat64Array.buffer),我们是在 nodejs 中开发的,所以我们在 js 中做所有事情。

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


【解决方案1】:

是的,使用ArrayBuffer(带有外部后备存储)是在 JavaScript 和 C 之间共享(数字)数组的一种有效方式,因为它不需要您复制内容。假设您可以在 JavaScript 端使用 TypedArray “从头开始”;如果同样的限制适用于从一开始就使用doubleArray 并且您仍然必须复制,那么好处将更小或不存在(取决于您访问doubleArray 的速度)。

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

【讨论】:

  • 我认为你有一个观点,实际上在运行 JS 函数一段时间后,它会下降到 0.7 毫秒左右。谢谢你。如果我有时间,我会格式化我的代码并在以后放上它。我找到了一种使用 node js 插件删除副本的方法,还没有实现,现在我会坚持使用 JS。
猜你喜欢
  • 2020-05-12
  • 2013-05-25
  • 2013-02-03
  • 2011-11-29
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2020-09-03
相关资源
最近更新 更多