系统调用与库函数对于不同buffer size写文件效率对比

系统调用与库函数对于不同bufSize写文件耗时对比

 

By wangshudian@ gmail.com

 

一、实验说明

 

函数原型:

       int write(int fd, char *buf, unsigned bufSize);

    int fwrite(char *ptr, unsigned size, unsigned n, FILE *fp);

 

函数特点:

 

系统调用writeunbuffered的;

库函数fwritebuffered的。

 

参考文献:

李梦雨《文件IO函数和标准IO库函数的读写效率研究》

 下面基本书对系统调用与库函数的联系和区别也有讲解:

《C专家编程》

《程序员的自我修养》

《Beginning Linux Programming》 

二、实验数据

我上传到附件了:

http://download.csdn.net/detail/autoca/4349293

 

三、观察分析

1)对于系统调用write,当入参buffer size远小于文件系统的block size4096字节)时,效率极低;当入参buffer size接近或大于block size时效率接近最优。

2)对于库函数fwrite,入参buffer sizesize*n)的变化对写文件效率影响不明显,其效率高于write最优值的1/2(想必是fwritewrite做了封装,多了一层调用,于是表现出1/2的关系)。

 

 

三、实验结论

 

如果是多次循环,每次只写少量字符,那么库函数效率高。

如果循环次数少,每次都写大块数据,那么系统调用效率高。

 

在对效率有特殊要求的场合,建议使用write且必须选取最优buffer size

对于一般应用,建议使用标准库函数,无需多虑。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 系统中,可以通过 `zlib` 库来进行 `gzip` 压缩和解压缩操作。如果要解压 `uImage.gz` 文件,可以使用 `zlib` 库提供的函数来完成。 下面是一个使用 `zlib` 库来解压 `uImage.gz` 文件的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <zlib.h> #define CHUNK_SIZE 1024 int main(int argc, char *argv[]) { gzFile infile; char *outfile_name; FILE *outfile; char buffer[CHUNK_SIZE]; int bytes_read; int ret; if (argc < 2) { fprintf(stderr, "Usage: %s uImage.gz\n", argv[0]); return -1; } /* 打开 gzip 文件 */ infile = gzopen(argv[1], "rb"); if (!infile) { fprintf(stderr, "Error: failed to open %s\n", argv[1]); return -1; } /* 构造输出文件名 */ outfile_name = (char *)malloc(strlen(argv[1]) - 2); strncpy(outfile_name, argv[1], strlen(argv[1]) - 3); strcat(outfile_name, "\0"); /* 打开输出文件 */ outfile = fopen(outfile_name, "wb"); if (!outfile) { fprintf(stderr, "Error: failed to create %s\n", outfile_name); return -1; } /* 逐块解压并入输出文件 */ while ((bytes_read = gzread(infile, buffer, CHUNK_SIZE)) > 0) { ret = fwrite(buffer, 1, bytes_read, outfile); if (ret < bytes_read) { fprintf(stderr, "Error: failed to write to %s\n", outfile_name); return -1; } } /* 关闭文件 */ gzclose(infile); fclose(outfile); free(outfile_name); printf("Done.\n"); return 0; } ``` 上面的代码中,我们先通过 `gzopen()` 函数打开 `uImage.gz` 文件,并指定以二进制(`"rb"`)方式打开。然后,我们通过 `malloc()` 函数动态分配内存,构造输出文件名,并打开输出文件。 接着,我们使用 `gzread()` 函数逐块从 `uImage.gz` 文件中读取数据,并通过 `fwrite()` 函数将解压后的数据入到输出文件中。最后,我们通过 `gzclose()` 和 `fclose()` 函数关闭打开的文件,并使用 `free()` 函数释放动态分配的内存。 注意,在解压 `uImage.gz` 文件时,我们只需要解压文件头之后的数据部分,因此输出文件名中去掉了 ".gz" 后缀。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值