node API buffer

2511 ワード

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 8 KBでメモリが漏れる
新しいBufferクラスをインスタンス化すると、インスタンス化時のサイズに応じてメモリ領域が申請され、必要な領域が8 KB未満であれば、現在の8 KBキャリアの残容量が新しいbufferインスタンスに十分かどうかを判定し、十分であれば、新しいbufferインスタンスを現在の8 KBキャリアに保存し、残りの空間を更新する.足りない場合は、新たに8 KBを申請し、現在のキャリアとして使用します.
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の2番目の方法と3の2番目の方法を比較したいと思っています.どちらがもっと速いですか.
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は中国語文字列を遮断し、一部のバイトが文字化けして表示される可能性がある.