前面我们使用所有的输入输出都是无缓冲的系统IO, 那么能不能用标准IO来代替系统IO呢?
可能有人回想问为什么要代替系统IO呢? 先来看一个例子就知道原因了.
复制文件
这里我使用系统IO和标准IO来复制一个比较大的文件来说明原因. 这里实验的文件大小是200M左右
系统IO :
完整代码 : stdcpy.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#define BUF_SIZE 50
int main(int argc, char *argv[]){
int readfd, writefd;
int len;
char buf[BUF_SIZE];
clock_t start, end;
readfd = open(argv[1], O_RDONLY);
writefd = open("txt", O_WRONLY | O_CREAT, 0755);
start = clock();
while((len = read(readfd, buf, sizeof(buf))) > 0)
write(writefd, buf, len);
end = clock();
printf("%f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
close(readfd);
close(writefd);
return 0;
}
运行程序 :
./sys txt.txt
运行了大概4秒. 接下来我们看一下标准IO.
标准IO :
完整代码 : syscpy.c
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#define BUF_SIZE 50
int main(int argc, char *argv[]){
FILE *readfp, *writefp;
char buf[BUF_SIZE];
clock_t start, end;
readfp = fopen(argv[1], "r");
writefp = fopen("txt", "w+");
start = clock();
while(fgets(buf, sizeof(buf), readfp) != NULL)
fputs(buf, writefp);
end = clock();
printf("%f seconds\n", (double)(end - start) / CLOCKS_PER_SEC);
fclose(readfp);
fclose(writefp);
return 0;
}
运行程序 :
./std txt.txt
小结
可以明显看出来标准IO的执行时间更短, 虽然可以通过调整数组的大小来减小运行时间, 但不可否认标准IO效率更高. 同样, 如果将标准IO运用在套接字中是不是传输效率也会大幅度提升呢? 这个我们下节再来说明
时间计算参考 : 程序运行时间计算