SDK для штрих-кодов JavaScript может быть построен на C/C++ для повышения производительности. Мы можем скомпилировать код C/C++ в надстройку Node.js или WebAssembly. Какой из них превосходит? Давайте попробуем Dynamsoft Barcode Reader SDK, чтобы найти ответ.

Надстройка Node.js C++ против WebAssembly

Скорость

Производительность жизненно важна для SDK. Согласно нашему здравому смыслу, надстройка C++ должна быть победителем. Однако интересно наблюдать за разрывом в производительности при запуске дополнения C++ и WebAssembly в приложении Node.js.

Создание надстройки C++ для Node.js

Скачать Dynamsoft Barcode Reader 6.2. Вы можете выбрать один выпуск Windows, Linux и macOS. Здесь я использую версию Linux.

Получите образец кода.

Скопируйте libDynamsoftBarcodeReaderx64.so в /usr/lib:

sudo cp <Your PATH>/libDynamsoftBarcodeReaderx64.so /usr/lib/libDynamsoftBarcodeReader.so

Установите node-gyp:

npm install -g node-gyp

Настройте среду здания:

node-gyp configure

Соберите расширение:

node-gyp build

Установите SDK штрих-кода WebAssembly

npm install dbrjs

Создайте простой сканер штрих-кода Node.js

var dbr = require('./build/Release/dbr');
var Module = require('dbrjs');
function decodeFileStreamAsync(fileName) {
let stats = fs.statSync(fileName);
let fileSize = stats["size"];
fs.open(fileName, 'r', function(status, fd) {
if (status) {
console.log(status.message);
return;
}
var source = fs.readFileSync(fileName);
var typedArray = new Uint8Array(source);
Module.onRuntimeInitialized = function() {
let dbr = new Module.BarcodeReaderWasm("t0068NQAAAKTSQDbEid8CTEeNluhTXi+h35G8R03xIHsyYNzZoa2GiU2a8y7s5Z1lfHsMW5dNyZmH6jQL51HUcoB5EhpDeDk=");
console.time('wasm');
let results = dbr.DecodeFileInMemory(typedArray, "");
console.timeEnd('wasm');
let json = JSON.parse(results);
let barcodeResults = json['textResult'];
let txts = [];
for (let i = 0; i < barcodeResults.length; ++i) {
console.log("Value : " + Buffer.from(barcodeResults[i].BarcodeText, 'base64').toString('ascii'));
}
console.log("Done............................................................\n");
};
let buffer = new Buffer(fileSize);
fs.read(fd, buffer, 0, fileSize, 0, function(err, bytesRead, data) {
console.time('native');
dbr.decodeFileStreamAsync(buffer, fileSize, barcodeTypes, function(err, msg) {
console.timeEnd('native');
let result = null;
for (index in msg) {
result = msg[index];
// console.log("Format: " + result['format']);
console.log("Value : " + result['value']);
}
console.log("Done............................................................\n");
}, "");
});
});
}

Запустите приложение, чтобы проверить результаты.

Оказывается, аддон Node.js C++ намного быстрее, чем WebAssembly.

Портативность

Хотя аддон C++ имеет отличную производительность, вам придется использовать разные компиляторы для его пересборки на разных платформах. В отличие от дополнения C++, WebAssembly является переносимым. Если у вас установлена ​​подсистема Linux в Windows, вы можете быстро протестировать считыватель штрих-кода Node.js, переключив Linux и Windows.

Разработка веб-приложений

Дополнение Node.js C++ может работать только на стороне сервера, тогда как WebAssembly может работать как на стороне сервера, так и на стороне клиента. Чтобы создать считыватель штрих-кода HTML5 для веб-браузеров, вы можете либо реализовать веб-службу RESTful с надстройкой C++, либо создать ее с помощью WebAssembly SDK.

Пример: как использовать Dynamsoft WebAssembly Barcode SDK

Node.js

Создайте index.js:

const fs = require('fs');
var source = fs.readFileSync('test.jpg');
var typedArray = new Uint8Array(source);
const Module = require('dbrjs');
Module.onRuntimeInitialized = function() {
let dbr = new Module.BarcodeReaderWasm("t0068NQAAAKTSQDbEid8CTEeNluhTXi+h35G8R03xIHsyYNzZoa2GiU2a8y7s5Z1lfHsMW5dNyZmH6jQL51HUcoB5EhpDeDk=");
console.time('wasm');
let results = dbr.DecodeFileInMemory(typedArray, "");
console.timeEnd('wasm');
let json = JSON.parse(results);
let barcodeResults = json['textResult'];
let txts = [];
for (let i = 0; i < barcodeResults.length; ++i) {
txts.push(Buffer.from(barcodeResults[i].BarcodeText, 'base64').toString('ascii'));
}
console.log(txts.join(", "));
};

Запустите приложение:

node index.js

Интернет

var reader;
c.onRuntimeInitialized = function () {
document.getElementById('anim-loading').style.display = 'none';
buttonFile.disabled = false;
buttonVideo.disabled = false;
reader = new c.BarcodeReaderWasm("t0068NQAAAKTSQDbEid8CTEeNluhTXi+h35G8R03xIHsyYNzZoa2GiU2a8y7s5Z1lfHsMW5dNyZmH6jQL51HUcoB5EhpDeDk=");
};
if (reader) {
try {
// results = reader.DecodeBuffer(idd.buffer, imageWidth, imageHeight, imageWidth * 4, 7, "");
let results = reader.DecodeFileInMemory(arrayBuffer, "");
let json = JSON.parse(results);
let barcodeResults = json['textResult'];
let txts = [];
for (let i = 0; i < barcodeResults.length; ++i) {
txts.push(b64DecodeUnicode(barcodeResults[i].BarcodeText));
}
barcode_result.textContent = txts.join(", ");
} catch (e) {
console.log(e);
}
}

Вывод

Если вы стремитесь к максимальной производительности для Node.js, выберите надстройку C++. Если разрыв в производительности для вас не имеет большого значения, WebAssembly, без сомнения, лучший выбор.

Лицензия

Получите пробную лицензию.

Исходный код

https://github.com/dynamsoft-dbr/webassembly

Первоначально опубликовано на www.codepool.biz 6 августа 2018 г.