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


Posted in Javascript onMarch 17, 2016

对于初学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。

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

Buffer对象拼接功能

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

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

Javascript 相关文章推荐
jquery 事件执行检测代码
Dec 09 Javascript
JavaScript Event学习第七章 事件属性
Feb 07 Javascript
JavaScript高级程序设计(第3版)学习笔记9 js函数(下)
Oct 11 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
JavaScript中ES6字符串扩展方法
Aug 26 Javascript
jquery datatable服务端分页
Aug 31 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
微信小程序自定义模态对话框实例详解
Aug 16 Javascript
vue 本地环境跨域请求proxyTable的方法
Sep 19 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
Feb 11 Javascript
vue 限制input只能输入正数的操作
Aug 05 Javascript
js仿京东放大镜效果
Aug 09 Javascript
Node.js实用代码段之获取Buffer对象字节长度
Mar 17 #Javascript
jquery基础知识第一讲之认识jquery
Mar 17 #Javascript
Angularjs 滚动加载更多数据
Mar 17 #Javascript
基于jquery实现智能提示控件intellSeach.js
Mar 17 #Javascript
JavaScript函数内部属性和函数方法实例详解
Mar 17 #Javascript
基于jquery实现简单的分页控件
Mar 17 #Javascript
jQuery实现图片局部放大镜效果
Mar 17 #Javascript
You might like
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
php制作动态随机验证码
2015/02/12 PHP
PHP简单实现文本计数器的方法
2016/04/28 PHP
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
javascript中打印当前的时间实现思路及代码
2013/12/18 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(一)
2017/05/11 Javascript
AngularJS使用拦截器实现的loading功能完整实例
2017/05/17 Javascript
Angular 2父子组件数据传递之@Input和@Output详解(下)
2017/07/05 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
JQuery插件tablesorter表格排序实现过程解析
2020/05/28 jQuery
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
Python入门之后再看点什么好?
2018/03/05 Python
对numpy中的数组条件筛选功能详解
2018/07/02 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
python实现祝福弹窗效果
2019/04/07 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
Python 寻找局部最高点的实现
2019/12/05 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
解决python运行启动报错问题
2020/06/01 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
如何写一个自定义标签
2012/12/28 面试题
员工培训心得体会
2013/12/30 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
成都人事代理协议书
2014/10/25 职场文书
课题研究阶段性总结
2015/08/13 职场文书