使用SpiderMonkey JS引擎在JavaScript和C / C ++之间快速进行二进制数据交换

时间:2013-03-20 07:15:17

标签: spidermonkey

最近我了解到V8中有“外部阵列”。因此,当您在应用程序中嵌入V8时,您可以将C数组映射到JS数组,甚至可以选择一个类型,无论是char,word,int等。这可以显着加快JS和C之间的数据交换。问题在SpiderMonkey中有类似的东西吗?

我试过谷歌“spidermonkey外部数组”,“二进制数组”,“地图数组”等等,到目前为止没有运气。

我有SpiderMonkey源代码,但要熟悉它需要很长时间。

1 个答案:

答案 0 :(得分:3)

在SpiderMonkey中,您可以使用ArrayBuffer。

var buffer = new ArrayBuffer(16)
var int32View = new Int32Array(buffer);
for (var i = 0; i < int32View.length; i++) {
  int32View[i] = i * 3
}
array_dump(buffer)

现在是C ++部分:

#include "js/jstypedarray.h"

static JSBool my_array_dump(JSContext *cx, uintN argc, jsval *vp) {
    JSObject *obj;
    JS_ValueToObject(cx, vp[0 + 2], &obj);
    js::ArrayBuffer *A;
    A = js::ArrayBuffer::fromJSObject(obj);
    int *B = (int*) A->data;
    for (int i = 0; i < A->byteLength / 4; i++) printf("%i ", B[i]);
    return JS_TRUE;
}

看起来像这样你可以在JS和C / C ++之间传递大量数据,而且没有任何开销。

当然最好在SpiderMonkey文档中对此进行清楚解释。但是当你进入Mozilla项目时经常发生这种情况,你最终会挖掘包含和来源,所以我认为这个答案可能对某些人有用。