Webassembly работает намного медленнее, чем чистая функция JavaScript.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Webassembly работает намного медленнее, чем чистая функция JavaScript.

Сообщение Anonymous »

Я новичок в веб-сборке. я просто пробую, написав функцию для фильтрации массива объектов по некоторым критериям и возврата массива идентификаторов. я запускаю эту функцию и измеряю время выполнения. Удивительно, но Webassembly работает в 10 раз медленнее, чем JS.
Моя функция фильтра JS:

Код: Выделить всё

function filter(array: Obj[], criteria: Filter, additionalArr: number[]){
//Filter....
}
Файл C++ такой:

Код: Выделить всё

#include
#include

struct Filter {
vector f1;
vector f2;
vector f3;

Filter(): f1({}), f2({}), f3({}) {}

Filter(vector f1, vector f2, vector f3) :
f1(f1), f2(f2), f3(f3) {}
};

struct Obj {
int p1;
int p2;
string p3;

Obj (): p1(0), p2(0), p3("") {}

Obj (int p1, int p2, string p3) :
p1(p1), p2(p2), f3(p3) {}
}

Obj processObj(emscripten::val jsObj){
Obj wasmObj = new Obj();
wasmObj.p1 = jsObj["p1"].as();
wasmObj.p2 = jsObj["p2"].as();
wasmObj.p3 = jsObj["p3"].as();

return wasmObj;
}

Filter processFilter(emscripten::val jsFilter){
//Similar to processObj
}

bool filterOneObj(Obj obj, Filter criterias, vector additionalArr) {
//Filter one obj base on criterias and additionalArr
}

emscripten::val wasmFilter(emscripten::val objJS, emscripten::val criteriaJS, emscripten:: val additionalArrJS) {
vector result;
Filter wasmFilter = processFilter(criteriaJS);
for(size_t i = 0; i < objJS["length"].as(); i++) {
if(filterOneObj()) result.push_back(objJS[i]["p1"].as());
}
return val::array(result);
}

EMSCRIPTEN_BINDINGS(module) {
class_("WasmFilter")
.constructor
.property("f1", &Filter::f1)
.property("f2", &Filter::f2)
.property("f3", &Filter::f3)

class_("WasmObj")...//similar to Filter

emscripten::register_vector("IntList");

emscripten::register_vector("ObjList");

emscripten::function("wasmFilter", &wasmFilter);
}
Скомпилируйте C++ в Wasm с помощью этой команды:

Код: Выделить всё

emcc -lembind -Iinclude -s WASM= -s EXPORT_ES6=1 -s MODULARIZE=1 -s ENVIRONMENT=web filter.cpp -o filter.js
Я запускаю эту функцию с большим массивом (100 000), и в результате время выполнения JS составляет около 1 секунды, а вызов WasmFilter из JS составляет около 10 секунд.
Я не знаю, какая часть C++-файл заставляет Wasm работать очень медленно. Это из-за использования embind???
Я читал много статей, в которых показано, что Webassembly быстрее, чем Js.
Я также знаю, что в некоторых случаях Webassembly не работает. эффективный. Но в моем случае Webassembly работает очень медленно.
Почему? И есть ли эффективный способ передачи объекта и массива между JS и C++??

Подробнее здесь: https://stackoverflow.com/questions/783 ... t-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»