Node.js实用代码段之正确拼接Buffer

对于初学Node.js框架的开发人员来说,可能认为Buffer模块比较易学、重要性也不是那么突出。其实,Buffer模块在文件I/O和网络I/O中应用非常广泛,其处理二进制的性能比普通字符串性能要高出很多,重要性可谓是举足轻重。下面我们通过一个例程向读者演示一下,使用buf.concat()方法进行拼接的过程。

本例ch04.buffer-concat.js主要代码如下:

/**
 * ch04.buffer-concat.js
 */
console.info("------  Buffer concat vs String concat ------");
console.info();
/**
 * define variable
 * @type {Buffer}
 */
var buf = new Buffer("this is Buffer concat test!");
var str = "this is String concat test!";
/**
 * start record time
 */
console.time("buffer concat test!");
var list = [];
var len = 100000 * buf.length;
for(var i=0; i<100000; i++){
  list.push(buf);
  len += buf.length;
}
/**
 * Buffer 对象拼接
 */
var s1 = Buffer.concat(list, len).toString();
console.timeEnd("buffer concat test!");
console.info();
console.time("string concat test!");
var list = [];
for(var i=100000; i>=0; i--) {
  list.push(str);
}
/**
 * String 对象拼接
 * @type {string}
 */
var s2 = list.join("");
console.timeEnd("string concat test!");
/**
 * end record time
 */
console.info();
console.info("------  Buffer concat vs String concat ------");

【代码分析】

第10行代码定义了一个Buffer对象,变量名为buf,并初始化了一个字符串数据("thisis Buffer concat test!");第11行代码定义了一个字符串变量str,并初始化了一个字符串数据("thisis String concat test!");从第15行代码开始到第26行代码结束,通过console.time()和console.timeEnd()方法完成一段时间间隔记录;第16~21行代码定义了一个数组变量list[],并使用buf变量对该数组变量进行初始化;第25行代码通过Buffer.concat(list,len)方法将list[]数组中的编码重新拼接成一个Buffer对象,关于Buffer.concat(list,len)方法的语法说明如下:

语法:Buffer.concat(list,[totalLength]) 
参数说明:

 list{Array}:数组类型,Buffer数组,用于被连接
 totalLength:{Number}类型,第一个参数Buffer数组对象的总大小

该方法返回一个保存着将传入buffer数组中所有buffer对象拼接在一起的buffer对象;如果传入的数组没有内容,或者totalLength参数是0,那将返回一个zero-length的buffer;如果数组中只有一项,那么这第一项就会被返回;如果数组中的项多于一个,那么一个新的Buffer对象实例将被创建;如果totalLength参数没有提供,虽然会从buffer数组中计算读取,但是会增加一个额外的循环来计算该长度,因此提供一个明确的totalLength参数将会使得Buffer.concat()方法执行的更快;

从图中显示的结果可以看到,使用Buffer.concat(list,len)方法进行拼接的耗时为48ms。

Buffer对象拼接功能

注意:Buffer.concat(list, [totalLength])方法的第2个参数totalLength比较特别,这里的totalLength不是数组长度是数组里Buffer实例的大小总和。

以上就是第二个实用的Node.js代码段,希望对大家的学习有所帮助。

(0)

相关推荐

  • node.js中的buffer.slice方法使用说明

    方法说明: 返回一个新的buffer对象,这个新buffer和老buffer公用一个内存. 但是被start和end索引偏移缩减了.(比如,一个buffer里有1到10个字节,我们只想要4-8个字节,就可以用这个函数buf.slice(4,8),因为他们共用一个内存,所以不会消耗内存,) 因为共用内存,所以修改新的buffer后,老buffer的内容同样也会被修改. 语法: 复制代码 代码如下: buffer.slice([start], [end]) 接收参数: start      开始位置

  • Node.js中使用Buffer编码、解码二进制数据详解

    JavaScript很擅长处理字符串,但是因为它最初的设计是用来处理HTML文档,因此它并不太擅长处理二进制数据.JavaScript没有byte类型,没有结构化的类型(structured types),甚至没有字节数组,只有数字和字符串.(原文:JavaScript doesn't have a byte type - it just has numbers - or structured types, or http://skylitecellars.com/ even byte arra

  • 使用node.js中的Buffer类处理二进制数据的方法

    前言 在Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区.这篇文章就详细介绍了node.js中的Buffer类处理二进制数据的方法,下面话不多说,来看看详细的介绍. 创建Buffer对象 第一种:直接使用一个数组来初始化缓存区 var arr = [0,1,2] var buf = new Buffer(arr) console.log(buf) 执行效果: 第二种:直接使用一个字符串来初始化缓存区 var str = 'hello' var buf = n

  • 浅谈Node.js:Buffer模块

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该类实现了Uint8Array接口,并对其进行了优化,它的实例类似于整型数组,但是它的大小在创建后便不可调整.在介绍Buffer如何使用之前,先介绍几个知识点. 1.V8引擎的内存使用限制 V8引擎最大堆内存使用在32位系统上默认为512M,在64位系统上是1GB,虽然可以使用--max-old-sp

  • 关于Node.js中Buffer的一些你可能不知道的用法

    前言 在大多数介绍 Buffer 的文章中,主要是围绕数据拼接和内存分配这两方面的.比如我们使用fs模块来读取文件内容的时候,返回的就是一个 Buffer: fs.readFile('filename', function (err, buf) { // <Buffer 2f 2a 2a 0a 20 2a 20 53 75 ... > }); 在使用net或http模块来接收网络数据时,data事件的参数也是一个 Buffer,这时我们还需要使用Buffer.concat()来做数据拼接: v

  • 深入理解Node中的buffer模块

    在Node.ES2015出现之前,前端工程师只需要进行一些简单的字符串或DOM操作就可以满足业务需要,所以对二进制数据是比较陌生.node出现以后,前端面对的技术场景发生了变化,可以深入到网络传输.文件操作.图片处理等领域,而这些操作都与二进制数据紧密相关. Node里面的buffer,是一个二进制数据容器,数据结构类似与数组,数组里面的方法在buffer都存在(slice操作的结果不一样).下面就从源码(v6.0版本)层面分析,揭开buffer操作的面纱. 1. buffer的基本使用 在No

  • Node.js实用代码段之获取Buffer对象字节长度

    我们知道Node.js框架下的Buffer对象能够对二进制数据提供很好的支持,那么获取一个Buffer对象真实的字节长度则是必须要用到的功能了.Node.js框架为开发人员提供了一个Buffer.byteLength()方法,下面我们借助一个官方文档提供的例程向读者演示一下该方法的使用过程. 本例ch04.buffer-byteLength.js主要代码如下: /** * ch04.buffer-byteLength.js */ console.info("------Buffer.byteLe

  • Node.js实用代码段之正确拼接Buffer

    对于初学Node.js框架的开发人员来说,可能认为Buffer模块比较易学.重要性也不是那么突出.其实,Buffer模块在文件I/O和网络I/O中应用非常广泛,其处理二进制的性能比普通字符串性能要高出很多,重要性可谓是举足轻重.下面我们通过一个例程向读者演示一下,使用buf.concat()方法进行拼接的过程. 本例ch04.buffer-concat.js主要代码如下: /** * ch04.buffer-concat.js */ console.info("------ Buffer con

  • 微信小程序实用代码段(收藏版)

    前言 排名不分先后,按自己的习惯来的. 总结经验,不喜勿喷哦~ 一.tab切换 <view class=" {{currentTab==0 ? 'select' : ''}}" data-current="0" bindtap="swichNav"> tab1</view> <view class=" {{currentTab==1 ? 'select' : ''}}" data-current=

  • 浅析Node.js实用的内置API

    目录 Process OS 在构建 Node.js 应用程序时,了解 Node.js 开箱即用的实用程序和 API 有助于满足常见用例和开发需求. Process:检索有关环境变量.参数.CPU 使用率和报告的信息. OS:检索 Node 正在运行的操作系统和系统相关信息:CPU.操作系统版本.主目录等. Process process 对象提供有关 Node.js 应用程序以及控制方法的信息.使用它来获取环境变量.CPU 和内存使用情况等信息.process 在全局范围内可用:可以在不导入的情

  • Node.js一行代码实现静态文件服务器的方法步骤

    静态文件服务器实现 nodejs不仅仅可以用来写服务端接口,用来做静态文件服务器替代nginx的功能, 也是分分钟可以搞定的. 话不多说,先上代码: var server=http.createServer(function (req,res){ fs.createReadStream(Path.resolve(__dirname,"."+req.url)).pipe(res); }) 在项目根目录建一个hello.html文件测试一下 hello.html内容如下: <h1&g

  • js常用代码段整理

    每段代码前边都有功能注解和参数要求等说明文字,难度不大也就没做更多注释. 为看得清楚,这里依先后顺序做个小目录: 重写window.setTimeout, 理解递归程序的返回规律, 截取长字符串, 取得元素在页面中的绝对位置, 统计.去除重复字符(多种方法实现), 把有序的数组元素随机打乱(多种方法实现). 复制代码 代码如下: /* 功能:修改 window.setTimeout,使之可以传递参数和对象参数 (同样可用于setInterval) 使用方法: setTimeout(回调函数,时间

  • js常用代码段收集

    每段代码前边都有功能注解和参数要求等说明文字,难度不大也就没做更多注释. 为看得清楚,这里依先后顺序做个小目录: 重写window.setTimeout, 理解递归程序的返回规律, 截取长字符串, 取得元素在页面中的绝对位置, 统计.去除重复字符(多种方法实现), 把有序的数组元素随机打乱(多种方法实现). 复制代码 代码如下: /* 功能:修改 window.setTimeout,使之可以传递参数和对象参数 (同样可用于setInterval) 使用方法: setTimeout(回调函数,时间

  • 分享javascript、jquery实用代码段

    本文实例为大家简单分享javascript.jquery实用demo,供大家参考,具体内容如下 javascript判断H5页面离开 function onbeforeunloadFn(){ console.log('离开页面'); //...code } function showOnbeforeunload(flags){ if(flags){ document.body.onbeforeunload = onbeforeunloadFn; }else{ document.body.onbe

  • Ruby的25个编程细节(技巧、实用代码段)

    1.try 永远不会抛出异常 在 没有的时候 返回 nil 复制代码 代码如下: province_id = Province.find_by_name(prov).try(:id) 2.find(:first, :condotions) 方法 不言而与 复制代码 代码如下: mobile_info = MobileInfo.find(:first, :conditions => ["mobile_num = ? ", mobile_num.to_i]) 3.find(:all,

随机推荐