Быстрый обмен бинарными данными между JavaScript и C/C++ с движком SpiderMonkey JS

Недавно я узнал, что в V8 есть «Внешние массивы». Поэтому, когда вы встраиваете V8 в свое приложение, вы можете сопоставить свой C-массив с JS-массивом и даже выбрать тип: char, word, int и т. д. Это может значительно ускорить обмен данными между JS и C. Теперь вопрос есть ли что-то подобное в SpiderMonkey?

Я попробовал Google для «внешних массивов пауков», «бинарных массивов», «массивов карт» и некоторых других, но пока безуспешно.

У меня есть исходный код SpiderMonkey, но чтобы с ним ознакомиться, потребуется целая вечность.


person exebook    schedule 20.03.2013    source источник
comment
вот обсуждение внешнего массива V8 на SO. stackoverflow.com/questions/9218280/   -  person exebook    schedule 20.03.2013


Ответы (1)


В 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)

теперь часть С++:

#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, вы в конечном итоге копаетесь во включаемых файлах и источниках, поэтому я думаю, что этот ответ может быть кому-то полезен.

person exebook    schedule 21.03.2013