深入浅出NodeJS——Buffer

Javascript对字符串处理十分友好,无论是宽字节还是单字节字符串,都被认为是一个字符串。Node中需要处理网络协议、操作数据库、处理图片、文件上传等,还需要处理大量二进制数据,自带的字符串远不能满足这些要求,因此Buffer应运而生。

Buffer结构

Buffer是一个典型的Javascript和C++结合的模块,性能相关部分用C++实现,非性能相关部分用javascript实现。

Node在进程启动时Buffer就已经加装进入内存,并将其放入全局对象,因此无需require

Buffer对象:类似于数组,其元素是16进制的两位数。

Buffer内存分配

Buffer对象的内存分配不是在V8的堆内存中,在Node的C++层面实现内存的申请。

为了高效的使用申请来得内存,Node中采用slab分配机制,slab是一种动态内存管理机制,应用各种*nix操作系统。slab有三种状态:

(1) full:完全分配状态

(2) partial:部分分配状态

(3) empty:没有被分配状态

Buffer的转换

Buffer对象可以和字符串相互转换,支持的编码类型如下:

ASCII、UTF-8、UTF-16LE/UCS-2、Base64、Binary、Hex

字符串转Buffer

new Buffer(str, [encoding]),默认UTF-8

buf.write(string, [offset], [length], [encoding])

Buffer转字符串

buf.toString([encoding], [start], [end])

Buffer不支持的编码类型

通过Buffer.isEncoding(encoding)判断是否支持

iconv-lite:纯JavaScript实现,更轻量,性能更好无需C++到javascript的转换

iconv:调用C++的libiconv库完成

Buffer的拼接

注意res.on(‘data‘, function(chunk) {}),其中的参数chunk是Buffer对象,直接用+拼接会自动转换为字符串,对于宽字节字符可能会导致乱码产生,解决方法

(1) 通过可读流中的setEncoding()方法,该方法可以让data事件传递不再是Buffer对象,而是编码后的字符串,其内部使用了StringEncoder模块。

(2) 将Buffer对象暂存到数组中,最后在组装成一个大Buffer让后编码转换为字符串输出

Buffer在文件I/O和网络I/O中广泛应用,其性能举足轻重,比普通字符串性能要高出很多。

Buffer的使用除了与字符串的转换有性能损耗外,在文件读取时候,有一个highWaterMark设置对性能影响至关重要。

a. highWaterMark设置对Buffer内存的分配和使用有一定影响

b. highWaterMark设置过小,可能导致系统调用次数过多

深入浅出NodeJS——Buffer,布布扣,bubuko.com

时间: 2024-12-27 20:05:59

深入浅出NodeJS——Buffer的相关文章

深入浅出NodeJS——网络编程

Node提供丰富的网络编程模块 Node模块 协议 net TCP dgram UDP http HTTP https HTTPS TCP服务 TCP服务事件分为下面两类 (1).服务器事件 对于通过net.createServer()创建的服务器而言,它是一个EventEmitter实例,自定义事件有以下几种: listening:在调用listen()绑定端口或Domain Socket后触发,简写为server.listen(port, listener),通过第二个参数传入. conne

深入浅出NodeJS——内存控制

基于无阻塞.事件驱动建立的Node服务,具有内存消耗低的优点,非常适合处理海量的网络请求. V8的垃圾回收机制与内存限制 Javascript和Java类似,由垃圾回收机制来进行自动内存管理,而Node是构建在V8虚拟机基础上,所以其内存回收和V8运行机制息息相关. V8的内存限制:64位系统约为1.4GB.32位系统约为0.7GB process.memoryUsage(),返回值包括heapTotal代表已申请到的堆内存,heapUsed当前使用的内存,rss(resident set si

深入浅出Nodejs读书笔记

深入浅出Nodejs读书笔记 转:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html category:node学习笔记       2015-03-01 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过No

深入浅出nodejs(一) 模块加载机制

声明: 深入浅出nodejs系列文章将会在后面持续更新. 该系列文章部分参考 朴灵<深入浅出nodejs>,并加以总结补充 你真的了解require函数吗? 看似简单的require函数, 其实内部做了大量工作...下面我们将详细说明require为我们所做的一切 nodejs模块加载原理 node加载模块步骤: 1) 路径分析 (如判断是不是核心模块.是绝对路径还是相对路径等) 2) 文件定位 (文件扩展名分析, 目录和包处理等细节) 3) 编译执行 原生模块加载顺序 1) 缓存 2) 本地

深入浅出NodeJS——异步I/O

底层操作系统,异步通过信号量.消息等方式有着广泛的应用. PHP语言从头到尾都是以同步阻塞方式运行,利于程序员顺序编写业务逻辑. 异步I/O.事件驱动.单线程构成Node的基调. why异步I/O (1).用户体验 在Web2.0中Ajax广泛应用异步刷新机制可以更好的提高用户体验,消除UI阻塞.后端同样采用异步I/O可以有效较少同时请求多个资源的效应时间其为max(M,N). (2).资源分配 多任务主流方式: a. 单线程异步I/O b. 多线程并行 多线程的代价在于创建线程和执行期线程上下

&lt;&lt;深入浅出nodeJS&gt;&gt;读书笔记--&lt;一&gt;

前语:nodeJs这书早在五月份的时候就已经买了,那时候才刚刚接触node,本想着这书应该是node入门级比较系统化的书,可翻了几页之后呢,发现好多地方都晦涩难懂,特别是看到内建模块的C++实现时,瞬间有想瞌睡的感觉....-_-从这之后,这书一直被我闲置在书桌角落,再无动过,看书学习node的想法就这样放弃了,转为上网学习基础的语法API..就这样,边看API边跟着做一些小例子,慢慢的,发现基本的API用法都已经掌握了,于是,去搜搜与node有关的一些技术博客,希望能够进阶去了解node.开始

深入浅出NodeJS——异步编程

函数式编程 Javascript中函数作为一等公民,函数看成普通对象,可以作为参数或者返回值. 高阶函数:函数作为参数或者将函数作为返回值的函数 异步编程优势 基于事件驱动的非阻塞I/O模型 异步编程难点 (1) 异常处理,通常try/catch不一定适用,因为callback并不是在当前Tick中执行. Node在异常处理中约定将异常作为回调函数的第一个实参传回. (2)  函数嵌套过深 (3) 代码阻塞:没有sleep函数,通过setInterval()和setTimeout()模拟 (4)

《深入浅出NodeJS》mindmap

接触NodeJS有快两年了,但因为和我的工作内容关系不大,所以一直没有系统的学习.最近终于有空能系统地了解学习一下这门技术,于是买了一本朴灵老师的<深入浅出NodeJS>仔细研读.这本书内容不算很高深,但是讲得还算细致,豆瓣上面评分也不错.个人认为还是挺适合我的. 根据自己的理解,整理了mindmap,以便今后复习.

深入浅出Nodejs读书笔记(转)

原文来自我的博客:http://tw93.github.io/2015-03-01/shen-ru-qian-chu-nodejs-reading-mind-map.html 今天终于把朴灵老师写的<深入浅出Node.js>给学习完了, 这本书不是一本简单的Node入门书籍,它没有停留在Node介绍或者框架.库的使用层面上,而是从不同的视角来揭示Node自己内在的特点和结构.建议有一定Node基础或者做过Node方面的小项目的同学阅读,看完以后你的思维会有很奇特的碰撞,我看的时候就常常会有这样