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
vardbr = require('./build/Release/dbr');varModule = require('dbrjs');functiondecodeFileStreamAsync(fileName) {let stats = fs.statSync(fileName);let fileSize = stats["size"];fs.open(fileName, 'r', function(status, fd) {if(status) {console.log(status.message);return;}varsource = fs.readFileSync(fileName);vartypedArray = newUint8Array(source);Module.onRuntimeInitialized = function() {let dbr = newModule.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 = newBuffer(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 inmsg) {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');varsource = fs.readFileSync('test.jpg');vartypedArray = newUint8Array(source);const Module = require('dbrjs');Module.onRuntimeInitialized = function() {let dbr = newModule.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
Интернет
varreader;c.onRuntimeInitialized = function() {document.getElementById('anim-loading').style.display = 'none';buttonFile.disabled = false;buttonVideo.disabled = false;reader = newc.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 г.