• 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有可能截断中文字符串,导致有些字节显示为乱码。

  • 相关阅读:
    C++处理Json串——jsoncpp库
    古典文学--本经阴符七术
    古典文学--素书
    网络编程之getaddrinfo
    网络编程之addrinfo
    跳表数据结构
    MySQL 编译安装并且开启DEBUG模式
    volatile关键字详解
    istringstream、ostringstream、stringstream 类简介
    Selenium入门21 Select操作
  • 原文地址:https://www.cnblogs.com/wang-jing/p/4173558.html
Copyright © 2020-2023  润新知