https://cnodejs.org/topic/5189ff4f63e9f8a54207f60c

1、拼接字符串时,String比buffer要快,buffer需要toString()。当保存非utf-8字符串,2进制等等其他格式的时候,需要使用buffer。

var string3, buffer3;

console.time('write 1024*1024*10 string');

for(var j=0; j<1024*1024*10; j++){
var x = j+'';
string3 += x;
} console.timeEnd('write 1024*1024*10 string'); console.time('write 1024*1024*10 buffer'); buffer3 = new Buffer(1024*1024*10);
for(var j=0; j<1024*1024*10; j++){
var x = j+'';
buffer3.write(x, j);
} console.timeEnd('write 1024*1024*10 buffer');
//注意console的写法;buffer的创建,拼接。

2、buffer 8KB 会导致内存泄露

当我们实例化一个新的Buffer类,会根据实例化时的大小去申请内存空间,如果需要的空间小于8KB,则会多一次判定,判定当前的8KB载体剩余容量是否够新的buffer实例,如果够用,则将新的buffer实例保存在当前的8KB载体中,并且更新剩余的空间。如果不够用,则新申请一个8KB,并作为当前载体。

3、buffer拼接方法性能比较

var buf = new Buffer('sasdasd');

console.time('string += buf');

var s = '';
for(var j=0; j<100000; j++){
s += buf;
}
console.log('s.length:'+s.length); console.timeEnd('string += buf'); console.time('buf concat'); var list = [];
var len = 0;
for(var j=0; j<100000; j++){
list.push(buf);
len += buf.length;
}
var s2 = Buffer.concat(list, len).toString();
console.log('s2.length:'+s2.length); console.timeEnd('buf concat');
//后者要快

到这一步,我脑子就抽风了,想比较一个1的第二种方法 和 3的第二种方法,哪种更快:

var buf = new Buffer('sasdasd');

console.time('write 1024*1024*10 buffer');

var buffer3 = new Buffer(700000);
for(var j=0; j<100000; j++){
var x = 'sasdasd';
buffer3.write(x, j);
}
console.log('buffer3.length:'+buffer3.length); console.timeEnd('write 1024*1024*10 buffer'); console.time('buf concat'); var list = [];
var len = 0;
for(var j=0; j<100000; j++){
list.push(buf);
len += buf.length;
}
var s2 = Buffer.concat(list, len).toString();
console.log('s2.length:'+s2.length); console.timeEnd('buf concat');

写法有些变化,不过还是后一种更快。

接下来说说+=更容易出现的错误:根据《深入浅出node.js》

1、data += chunk; 等价于 data.toString() = data.toString() + chunk.toString();

2、toString()默认utf-8编码,这种情况下中文占3个字节,中文是宽字节编码,chunk有可能截断中文字符串,导致有些字节显示为乱码。

node API buffer的更多相关文章

  1. node 之 Buffer 笔记

    1. Buffer 相关 js 最初是被设计来处理 html的,因此它不善于处理二进制数据,只有数值和字符串类型.而 node 是基于 js 的,因为 node 需要实现一些譬如数据库通信.操作图像及 ...

  2. Node.js——Buffer

    介绍 JavaScript没有读取和操作二进制数据流的机制,但是 node.js 引入了Buffer 类型,可以操作TCP流或者文件流 使用Buffer可以用来对临时数据(二进制数据)进行存储,当我们 ...

  3. node的buffer模块

    Buffer这块很早前就想留一篇笔记.前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众. Buffer的含义是,在数据传输时用内存中的一 ...

  4. Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...

  5. 配置web pack loader 报错:Module build failed: Error: The node API for `babel` has been moved to `babel-core`.

    报错如下 Module build failed: Error: The node API for `babel` has been moved to `babel-core`. 在我配置loader ...

  6. 部署node api的二三事

    当接到node开发node api的时候,我就想用docker来部署,众所周知,node的版本更新迭代很快.很多以前需要babel后才能采用的方法正在不断被node 原生的支持.如果随便更换生产服务器 ...

  7. Headless Chrome Node API

    puppeteer Headless Chrome Node API https://github.com/GoogleChrome/puppeteer https://pptr.dev/ PWA h ...

  8. node api 之:Buffer

    在 ECMAScript 2015 引入 TypedArray 之前,JavaScript 语言没有读取或操作二进制数据流的机制. Buffer 类被引入作为 Node.js API 的一部分,使其可 ...

  9. node api 之:stream - 流

    stream 模块可以通过以下方式使用: const stream = require('stream'); 流可以是可读的.可写的.或者可读可写的. 所有的流都是 EventEmitter 的实例. ...

随机推荐

  1. python中迭代器(转)

    一.迭代器与for语句 网上许多文章说Python的for语句中,in关键字后面的对象是一个集合.例如 for i in [1,2,3] print i 上面代码中in关键字后面的对象[1,2,3]是 ...

  2. EasyUI 列表展示及基本格式

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  3. 每月IT摘录201805

    摘录自互联网的前辈心得: 一.技术:0.精通一个淘汰的技术对你没有任何价值.学习的精力有限,更应该花在值得学的技术上.比如网络.操作系统.数据结构.算法1.工作要有定力,更多的应该是关心问题如何更有效 ...

  4. Tree(树链剖分+线段树延迟标记)

    Tree http://poj.org/problem?id=3237 Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12 ...

  5. 230. Kth Smallest Element in a BST 找到bst中的第k小的元素

    [抄题]: Given a binary search tree, write a function kthSmallest to find the kth smallest element in i ...

  6. OC -网络请求 - NSURLConnection - GET

    #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDelegate> ...

  7. tp中url地址大小写问题

    在tp配置文件中有一个URL_CASE_INSENSITIVE选项,设置为true,表示大小写不敏感. 'URL_CASE_INSENSITIVE' => true

  8. 安全运维 -- Linux服务器使用公私钥密匙证书登录

    环境:Ubuntu 16 前言 黑客遍地都是,ssh/pop3/ftp等爆破工具的流行让站长的日常运维工作量大大加重.Metasplot,Bruter等工具更是针对以上协议有专门 的破解方法,有字典破 ...

  9. linux-radhat-gitlab服务搭建

    1.安装gitlab的依赖项 sudo yum install -y curl policycoreutils-python openssh-server cronie 2.设置防火墙 sudo lo ...

  10. SSL - 简介

    一.密码技术 要了解SSL协议,首先要了解:加密算法.消息摘要算法(又称为哈希算法Hash),数字签名等概念.这些技术每个都可以写出一整本的书,它们结合在一起,提供了保密性.完整性和身份验证的功能. ...