標籤:
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