我正在使用读/写来从本地磁盘常规文件读取/写入。
我必须读取/写入少量数据。例如
read(fd, buf, 15)
write(fd, buf, 39);
有人告诉我,当有人检查我的请求时,我应该避免少量的数据读/写。
他们说:例如,我应该分配一个较大的内存(例如4k),首先将小数据复制到大内存中,然后一次写入大内存,而不是多次写入小数据。
而且我还应该一次读取4k数据,并将其存储到大内存中,然后我才能使用该大内存。
但是我了解到,当我写小数据时,我写到页面缓存(?)中,因此内核将负责内存处理吗?当足够大时,内核将写入磁盘吗?
我明白吗?我应该避免读/写小数据吗?
最佳答案
您的想法正确,不,没有必要避免读取/写入小数据。
I/O子系统已经提供了BUFSIZ
字节的读取缓冲区(Linux上为8192字节,Windows上为512字节)(在过去的一年中#define
在glibc中发生了变化,最初是从_IO_BUFSIZE
派生而来,然后是_LIO_BUFSIZ
,现在仅是BUFSIZ
了。 glibc来源)
这是从_IO_BUFSIZ
到纯BUFSIZ
Mechanically remove IO name aliases for types and constants (Wed, 7 Feb 2018).的glibc提交
因此,无论是读取一个字节或8192
字节(在Linux上)还是512
字节(在Windows上),都没有任何性能损失。在您第一次从文件中请求数据时,I/O缓冲区已经填充了BUFSIZ
字节(或者如果文件包含的字符少于EOF
字节,则直到BUFSIZ
为止的字节数)。因此,您是直接从内存中的读取缓冲区读取数据,对于小规模读取不会造成性能损失。
写入以类似的方式处理,直到写入缓冲区已满(或调用syncfs
或fsync
),才将其写入磁盘,从而导致所有缓冲的文件数据都写入底层文件系统。