谈谈buffer:

mac2024-07-17  50

Node的应用场景中存在大量的文件,数据库I/O和网络I/O操作,这使得Node不得不处理大量二进制数据。于是创建了一个容器叫Buffer,存储二进制数据。Buffer位于global上,是全局的一个函数。流自动隐式可以创建Buffer,手动也可以创建Buffer。流是数据的集合,但是流数据不能一次性获取到,数据也不会全部load到内存中,流的生产者与消费者之间的速度通常是不一致的,因此需要buffer来暂存一些数据。手动创建Buffer就是Buffer.alloc()和Buffer.allocUnsafe()。alloc是安全的,allocUnsafe是不安全的,allocUnsafe是它会去内存中找一片空间去使用,里面还有内容,所以会显示出来的数据是有值的。alloc会把内存空间中的值全部清空为0然后再显示。allocUnsafe性能好,alloc安全性好。Buffer.from()将字符串转换成二进制存储在buffer中。buffer.toString()将buffer中二进制转换成字符串Buffer对象的内存分配不是在V8的堆内存中,而是在Node的C++层面实现内存的申请的。关于Buffer内存分配,当我们需要一个buffer,它会创建一个8Kb的空间,如果你只用1Kb,它会只分1kb的空间给你,如果你又创建一个buffer,也是1kb,它就会从后面再分配1kb的空间给你,省去了反复的创建和销毁,可以提升性能,但是会浪费空间。Buffer的长度不可变,要让它可变,就给它一个最大的长度,保证所有的都可以存下。
最新回复(0)