# Buffer与性能

Buffer在文件I/O和网络I/O中运用广泛,在应用中,我们通常操作字符串,但在网络中传输,一般转换为Buffer,以二进制传输。

TIP

在Node构建的Web应用中,可以选择将页面中的动态内容和静态内容分离,静态内容部分可以通过预先转换为Buffer的方式,使性能得到提升。由于文件自身是二进制数据,所以在不需要改变内容的场景下,尽量只读取Buffer,然后直接传输,不做额外的转换,避免损耗。

  • 文件读取
    在文件读取时,fs.createReadStream(path,opts)可以传入一些参数,其中highWaterMark设置会对性能产生重大影响。fs.createReadStream(path,opts)的工作是在内存中准备一段Buffer,理想状态下,每次读取文件的长度就是设置好的highWaterMark。
    由于fs.createReadStream()内部采用fs.read()实现,将会引起对磁盘的系统调用,对于大文件而言,highWaterMark的大小决定会触发系统调用和data事件的次数。`

  • highWaterMark的大小对性能有影响的点:

  1. highWaterMark设置对Buffer内存的分配和使用有一定影响。
  2. highWaterMark设置过小,可能导致系统调用次数过多

TIP

由于fs.createReadStream()内部采用fs.read()实现,将会引起对磁盘的系统调用,对于大文件而言,highWaterMark的大小决定会触发系统调用和data事件的次数。