博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[nodejs]Buffer vs String
阅读量:5343 次
发布时间:2019-06-15

本文共 3145 字,大约阅读时间需要 10 分钟。

疑问

按nodejs官方的文档说明,使用Buffer操作字节流通常会比转化成String要高效。

实际情况全都是这样的吗?
本文通过一个简单的解析HTTP Request Header实例来解开此疑问。

HTTP Request Header Demo

POST /foo HTTP/1.1\r\nHost: foo.example.com\r\nContent-Length: 5\r\nConnection:keep-alive\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nCookie:connect.sid=OY2nKGqI3obs5lYee0JKTjhf.FDtbY1Jz5Ngw5So9Jv3MUetI5ITvrIfwgCkRw%2FcXUCk\r\nUser-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.41 Safari/535.7\r\n\r\nq=bar

需求

获取Header中Host的值

Buffer版本

var SPACE = 0x20, // ' '    COLON = 0x3a, // 58, :    NEWLINE = 0x0a, // \n    ENTER = 0x0d; // \rexports.parse = function parse(data) {    var line_start = 0, len = data.length;    for(var i = 0 ; i < len; i++) {        // Host: xxx.abc.com        if(data[i] === COLON) {            var key = data.toString('ascii', line_start, i).toLowerCase();            i++; // skip ':'            if(key === 'host') {                var value_start = i;                while(i < len) {                    if(data[i] === ENTER) {                        return data.toString('ascii', value_start, i).trim().toLowerCase();                    }                    i++;                }            }        } else if(data[i] ===  ENTER && data[i+1] === NEWLINE) {            i += 2;            line_start = i;            if(data[i] ===  ENTER && data[i+1] === NEWLINE) {                // \r\n\r\n                return 'Host header not found';            }        }    }    return null;};

String版本

exports.parse = function parse(data) {    var lines = data.toString('ascii').split("\n");    var cut, name, host;    for (var i = 0, len = lines.length; i < len; i++) {        cut = lines[i].split(':');        name = cut[0];        if (name === 'Host') {            if (cut[1] === undefined) {                return 'Host header not found';            }            host = cut[1].trim().toLowerCase();            return host;        }    }    return null;};

测试脚本

var buffer_parse = require('./string-buffer-benchmark-parse-header-buffer').parse  , string_parse = require('./string-buffer-benchmark-parse-header-string').parse;var data = new Buffer('POST /foo HTTP/1.1\r\nHost: foo.example.com\r\nContent-Length: 5\r\nConnection:keep-alive\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nCookie:connect.sid=OY2nKGqI3obs5lYee0JKTjhf.FDtbY1Jz5Ngw5So9Jv3MUetI5ITvrIfwgCkRw%2FcXUCk\r\nUser-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.41 Safari/535.7\r\n\r\nq=bar');//console.log(buffer_parse(data));//console.log(string_parse(data), data.length);var n = 1000000;var start = new Date();for(var i = 0; i < n; i++) {    buffer_parse(data);}console.log('buffer_parse take: ' + (new Date() - start) + ' ms');start = new Date();for(var i = 0; i < n; i++) {    string_parse(data);}console.log('string_parse take: ' + (new Date() - start) + ' ms');

测试结果

$ node string-buffer-benchmark.jsbuffer_parse take: 1888 msstring_parse take: 4948 ms

结论

Buffer比String快多了。

转载于:https://www.cnblogs.com/fengmk2/archive/2011/11/19/2254786.html

你可能感兴趣的文章
4.镜像管理【Docker每天5分钟】
查看>>
4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」
查看>>
epoll编写web服务器
查看>>
active directory 正在重新建立索引 请稍候...
查看>>
网络流24题之软件补丁问题
查看>>
String js删除字符串的最后一个字符三种方法
查看>>
JQuery气泡提示插件jquery.contip.js
查看>>
java_Arrays的排序函数
查看>>
Mysql查询优化
查看>>
C宏展开的几个注意事项
查看>>
SQL SERVER Management Studio
查看>>
Jquery | 基础 | 事件的链式写法
查看>>
ASP数据库连接方法语法汇总
查看>>
如何实现ZBrush 4R7中按钮颜色的自定义
查看>>
jquery自定义验证方法
查看>>
两个大数相加,使用字符串模拟相加过程
查看>>
vmware workstation虚拟机中的redhat嘟嘟的响
查看>>
http请求中java中的302和sendRedirect的区别
查看>>
ES之六:ElasticSearch中Filter和Query的异同
查看>>
水浒三十二员猛将真实排名(卢俊义非第一)
查看>>