面试题答案
一键面试优化原理
- 减少系统调用次数:系统调用相对用户态函数调用开销较大。增大缓冲区可以减少read系统调用的次数,因为每次调用能读取更多数据。
- 利用局部性原理:操作系统的缓存机制倾向于顺序读取大块数据时更高效。合理大小的缓冲区有助于利用这种顺序访问的局部性。
- 避免内存浪费:缓冲区过大可能导致内存浪费,过小则会频繁进行系统调用。一般来说,对于磁盘I/O,4KB到8KB的缓冲区大小在多数情况下能取得较好的性能,因为这与底层文件系统的块大小相匹配。
示例代码
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#define BUFFER_SIZE 4096
int main() {
int fd;
ssize_t bytes_read;
char buffer[BUFFER_SIZE];
fd = open("example.txt", O_RDONLY);
if (fd == -1) {
perror("open");
return 1;
}
while ((bytes_read = read(fd, buffer, BUFFER_SIZE)) > 0) {
if (write(STDOUT_FILENO, buffer, bytes_read) == -1) {
perror("write");
close(fd);
return 1;
}
}
if (bytes_read == -1) {
perror("read");
close(fd);
return 1;
}
close(fd);
return 0;
}
此代码以4096字节(4KB)的缓冲区大小读取文件example.txt
,并将内容输出到标准输出。每次调用read
尽可能多地读取数据,减少系统调用次数,提高读取性能。