node API buffer
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的更多相关文章
- node 之 Buffer 笔记
1. Buffer 相关 js 最初是被设计来处理 html的,因此它不善于处理二进制数据,只有数值和字符串类型.而 node 是基于 js 的,因为 node 需要实现一些譬如数据库通信.操作图像及 ...
- Node.js——Buffer
介绍 JavaScript没有读取和操作二进制数据流的机制,但是 node.js 引入了Buffer 类型,可以操作TCP流或者文件流 使用Buffer可以用来对临时数据(二进制数据)进行存储,当我们 ...
- node的buffer模块
Buffer这块很早前就想留一篇笔记.前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众. Buffer的含义是,在数据传输时用内存中的一 ...
- Node.js Buffer(缓冲区)
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门 ...
- 配置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 ...
- 部署node api的二三事
当接到node开发node api的时候,我就想用docker来部署,众所周知,node的版本更新迭代很快.很多以前需要babel后才能采用的方法正在不断被node 原生的支持.如果随便更换生产服务器 ...
- Headless Chrome Node API
puppeteer Headless Chrome Node API https://github.com/GoogleChrome/puppeteer https://pptr.dev/ PWA h ...
- node api 之:Buffer
在 ECMAScript 2015 引入 TypedArray 之前,JavaScript 语言没有读取或操作二进制数据流的机制. Buffer 类被引入作为 Node.js API 的一部分,使其可 ...
- node api 之:stream - 流
stream 模块可以通过以下方式使用: const stream = require('stream'); 流可以是可读的.可写的.或者可读可写的. 所有的流都是 EventEmitter 的实例. ...
随机推荐
- Java学习 第二节
1.非递归求第四十个斐波那契数 package test; public class fibonacci2 { public static void main(String arg[]) { ; ; ...
- spring中作用域的问题
在一般情况下:我们登录系统时,第一次登录当用户名或密码输入错误,在登录页面给出错误原因,当我们再刷新登录页面,应该是首次登录系统的页面(这时就不应该再给出出错提示),这时我们就应该想到错误提示信息到底 ...
- JFR 与 JProfilter Jvmisualvm
只有JFR 是可以在生产环境使用 采用C++独立写的采样手机功能 而 JProfilter/JVisualvm 都只能在测试环境下使用 使用instrument 机制 ,还有debug 框架 最早是 ...
- HttpClient 4 和 HttpClient 3 超时
HttpClient 4: 连接超时: httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,6000 ...
- EasyUI多选的获取
function deletePRE() { var rows = $('#dg').datagrid('getSelections'); var ids = []; var other_ids = ...
- A* 算法详解
最近刷bin巨的搜索进阶专题,做到一个需要A*算法来解决的题,于是开始学A*算法,十分有用处的算法,虽然看上去听复杂的,但其实原理很容易理解,下面转自一篇文章,讲得真的很好. 转:https://ww ...
- 兼容多浏览器的网页复制插件(ZeroClipboard)
前言: 常规利用JS编写的网页复制功能是最简单的方法,但是只对IE有效,无法做到兼容其它浏览器,对其他浏览器也就只能弹窗提示用户手动复制了. <script type="text/ja ...
- iOS下JS与OC互相调用(七)--Cordova 环境搭建
Cordova大家可能比较陌生,但肯定听过 PhoneGap ,Cordova 就是 PhoneGap 被 Adobe 收购后所改的名字.它是一个可以让 JS 与原生代码互相通信的一个库,并且提供了一 ...
- mysql的外键知识
外键的作用 1.用来约束两张表中的字段 2.外键也可以用来实现一对多 我们先举一个这样的例子,让大家对外键有一个基本的认识 当前我们有一个需求就是,需要创建一张表,这张表要包括“姓名”,“年龄”,“工 ...
- 遍历XML文件
#encoding=utf-8 from xml.etree import ElementTree as ET #要找出所有人的年龄 per=ET.parse('d:\\1.xml') p=per.f ...