- 3.9 io效率问题
- 查看程序执行时间:
终端输入:time ./a.out
real(总时间) = user(用户时间) + sys(系统调用)
- 程序性能测试:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #define BUFFSIZE 4096 int main(void) { int n; char buf[BUFFSIZE]; while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) //手动输入 if (write(STDOUT_FILENO, buf, n) != n) // 把buf的内容重定向到STDOUT_FILENO标准输出上 perror("write error"); if (n < 0) perror("read error"); exit(0); }
用不同的BUFFERSIZE来运行程序,下图展示了20种不同缓冲区长度读取516581760字节文件得到的结果。可以得知匹配磁盘长度(由st_blksize的大小决定)的附近读取速度是最快的。BUFFERSIZE大小为4096前后的读取速度很快。差别不是很大。
大多数文件系统为改善性能:都采用预读(read ahead)的技术
......
3.10 文件共享
面试:写程序删除一个文件第10行?
1. 打开两次:
通过getline/lseek找到第11行行首--->读取之后的内容---->写到新文件
通过getline/lseek找到第10行行首--->读取之前的内容---->写到新文件
2. 多线程文件共享:
如果上述的1 动作可以放在两个线程进行,实现文件共享,进而提高调用速度。