37. 标准IO

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Function_Dou/article/details/89949697

前面我们使用所有的输入输出都是无缓冲的系统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运用在套接字中是不是传输效率也会大幅度提升呢? 这个我们下节再来说明

时间计算参考 : 程序运行时间计算

猜你喜欢

转载自blog.csdn.net/Function_Dou/article/details/89949697