Node.js Buffer用法解读

2020-06-17 06:55:11易采站长站整理


node --zero-fill-buffers index.js

当分配的空间小于4KB的时候,allocUnsafe会直接从之前预分配的Buffer里面slice空间,因此速度比allocUnsafeSlow要快,当大于等于4KB的时候二者速度相差无异。


// 分配空间等于4KB
function createBuffer(fn, size) {
console.time('buf-' + fn);
for (var i = 0; i < 100000; i++) {
Buffer[fn](size);
}
console.timeEnd('buf-' + fn);
}
createBuffer('alloc', 4096);
createBuffer('allocUnsafe', 4096);
createBuffer('allocUnsafeSlow', 4096);

// 输出
buf-alloc: 294.002ms
buf-allocUnsafe: 224.072ms
buf-allocUnsafeSlow: 209.22ms


function createBuffer(fn, size) {
console.time('buf-' + fn);
for (var i = 0; i < 100000; i++) {
Buffer[fn](size);
}
console.timeEnd('buf-' + fn);
}
createBuffer('alloc', 4095);
createBuffer('allocUnsafe', 4095);
createBuffer('allocUnsafeSlow', 4095);
// 输出
buf-alloc: 296.965ms
buf-allocUnsafe: 135.877ms
buf-allocUnsafeSlow: 205.225ms

需要谨记一点:new Buffer(xxxx) 方式已经不推荐使用了

Buffer使用

buffer转字符串


const buf = Buffer.from('test');
console.log(buf.toString('utf8')); // test
console.log(buf.toString('utf8', 0, 2)); // te

buffer转json


const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
console.log(buf.toJSON()); // { type: 'Buffer', data: [ 1, 2, 3, 4, 5 ] }

buffer裁剪,裁剪后返回的新的buffer与原buffer指向同一块内存


buf.slice([start[, end]])

start 起始位置
end 结束位置(不包含)

示例:


var buf1 = Buffer.from('test');
var buf2 = buf1.slice(1, 3).fill('xx');
console.log("buf2 content: " + buf2.toString()); // xx
console.log("buf1 content: " + buf1.toString()); // txxt

buffer拷贝,buffer与数组不同,buffer的长度一旦确定就不再变化,因此当拷贝的源buffer比目标buffer大时只会复制部分的值


buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

示例:


var buf1 = Buffer.from('abcdefghijkl');
var buf2 = Buffer.from('ABCDEF');

buf1.copy(buf2, 1);
console.log(buf2.toString()); //Abcdef

buffer相等判断,比较的是二进制值


buf.equals(otherBuffer)