文档章节

JavaScript条形码SDK比较:Node.js C/C++扩展 vs WebAssembly

yushulx
 yushulx
发布于 2018/08/14 15:22
字数 785
阅读 61
收藏 0

高性能的算法库通常都是用C/C++编写。当你想要用JavaScript来开发条形码商业应用,你有两个选择:1.通过node-gyp来编译一个Node.js C/C++扩展。2.把C/C++代码编译成WebAssembly。这里基于Dynamsoft Barcode Reader来做一个比较。

序列号

申请一个免费试用的序列号

安装

特点对比

速度

开发应用,性能至关重要。毫无疑问,C/C++的扩展性能肯定更好。不过WebAssembly的差距到底要多大,要测试过才知道。

下载编译Dynamsoft Barcode Reader Node.js扩展

cd src
node-gyp configure
node-gyp build

创建一个简单的条形码应用:

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条形码扫描

WebAssembly耗时是C++扩展的3倍。

可移植性

虽然Node.js C/C++扩展的性能占优,但是在不同平台上必须重新编译,这样非常麻烦。而WebAssembly是没有这个问题的。在Windows上安装Linux子系统可以快速测试。

WebAssembly Windows Linux

Web应用开发

如果要做Web应用开发。Node.js的扩展只能用于服务端,而WebAssembly既可以用在服务端,也可以用在网页客户端。部署在服务端就需要通过HTTP来通信,这样如果要做一个网页条形码应用,就需要不断发送数据,解码,再返回结果。很显然这样的效率是不如网页客户端直接做条形码检测的。

WebAssembly条形码开发示例

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

Web

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);
      }
}

Dynamsoft Barcode Reader WebAssembly

结论

如果你要开发服务端的应用,而且追求性能,选择Node.js C/C++扩展。如果不是太在意性能上的那点差异,WebAssembly肯定是最佳选择。

源码

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

© 著作权归作者所有

yushulx
粉丝 29
博文 107
码字总数 60955
作品 0
杭州
私信 提问
构建基于 Node.js 的条形码识别程序

在这篇文章中,我们将展示一个非常简单的方法构建一个自定义的 Node 模块,该模块封装了Dynamsoft Barcode Reader SDK ,支持 Windows、Linux 和 OS X,同时我们将演示如何集成这块模块实现一...

oschina
2016/02/12
4K
2
Node.js C++扩展实现

因为有了Node.js,JavaScript可以被用于服务端编程。通过各种扩展,Node.js可以变得非常强大。今天分享下怎样用C++创建Node.js扩展。 参考原文:Making Dynamsoft Barcode SDK an Addon for...

yushulx
2015/06/02
4.4K
0
结合源码分析 Node.js 模块加载与运行原理

Node.js 的出现,让 JavaScript 脱离了浏览器的束缚,进入了广阔的服务端开发领域。而 Node.js 对 CommonJS 模块化规范的引入,则更是让 JavaScript成为了一门真正能够适应大型工程的语言。 ...

技术小能手
2018/08/17
0
0
WebAssembly和Emscripten工作整理

写在前面 之前做过一段时间的WebAssembly的研究,写过几个WebAssembly Demo,并且阅读并翻译了很多篇Emscripten官方文档,今天对这些东西做一个总结。 如果有需要对这块知识了解的同学,就可...

云荒杯倾
2018/01/10
0
0
WebAssembly:系统编程语言的逆袭

引子 Any application that can be written in JavaScript, will eventually be written in JavaScript. ——Atwood's Law 有人用 JavaScript 做语法词法解析,有人写了 x86 模拟器, 还有人用......

ThoughtWorks中国
2018/06/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哪些情况下适合使用云服务器?

我们一直在说云服务器价格适中,具备弹性扩展机制,适合部署中小规模的网站或应用。那么云服务器到底适用于哪些情况呢?如果您需要经常原始计算能力,那么使用独立服务器就能满足需求,因为他...

云漫网络Ruan
今天
9
0
Java 中的 String 有没有长度限制

转载: https://juejin.im/post/5d53653f5188257315539f9a String是Java中很重要的一个数据类型,除了基本数据类型以外,String是被使用的最广泛的了,但是,关于String,其实还是有很多东西...

低至一折起
今天
21
0
OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
11
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
9
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部