标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)
我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open()、close()、write()、read()等,而标准C语言的库函数中也有一套对文件的操作函数fopen()、fclose()、fwrite()、fread()等.。那么同样是对文件的操作函数,标C与UC有什么区别呢?是标C效率高还是UC效率高呢?今天就让我们来一探究竟。
程序作用:将0~999999这1000000个整型数据写入文件。
1、标准C实现大量数据写入文件:
/*文件名test1.c*/
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000000
int main (void)
{
FILE * fp = fopen("test1.txt","w");
if(fp == NULL){
perror("fopen test1.txt");
exit(EXIT_FAILURE);
}
int i;
for(i = 0; i < MAX; i++){
fwrite(&i, sizeof(int), 1, fp);/*我们采用fwrite一个一个写入文件*/
}
fclose(fp);
return 0;
}
/*gcc -o test1 test1.c编译*/
写入文件的效率测试结果:

2、Linux系统函数实现大量数据写入文件:
/*文件名test2.c*/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#define MAX 1000000
int main (void)
{
int fd = open("test2.txt",O_RDWR|O_TRUNC|O_CREAT,0666);
/*O_RDWR可读可写,O_CREAT没有则新建,O_TRUNC覆盖写入(原有内容小清空),O_APPEND追加写入(原有内容不清空)*/
if(fd == -1){
perror("open test2.txt");
exit(EXIT_FAILURE);
}
int i;
for(i = 0; i < MAX; i++){
write(fd, &i, sizeof(int));
}
close(fd);
return 0;
}
/*gcc -o test2 test2.c编译*/
写入效率测试结果:

我们发现系统函数的使用并没有使程序运行速率(写入速率)变快而是变慢了几十倍,而且在测试中,我们可以看见增加的时间基本都是在sys(系统层面)中增加的。这是因为,系统函数在用户层没有缓冲区,在内核层有缓冲区,但是缓冲区很小,所以大量数据在写入文件时,频繁刷新缓冲区降低了写入速率。所以系统函数(如write)需要加自定义缓冲区以提高速率,而标准C函数(如fwrite)不用自己设置缓冲区,如果系统函数用自定义缓冲区其效率比标C要好,不定义缓冲区则效率很低,但是缓冲区大小要合适,否则物极必反(即使有缓冲区,从缓冲区向文件中写也是一个一个写入的)。
3、Linux系统函数实现大量数据写入文件修改:
/*文件名test3.c*/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#define MAX 1000000
#define BUF_SIZE 500
/*缓冲区大小,合适为宜,多少为合适需要自己测试,但是不同大小的缓冲区影响肯定是不同的*/
int main (void)
{
int fd = open("test3.txt",O_RDWR|O_TRUNC|O_CREAT,0666);
if(fd == -1){
perror("open test3.txt");
exit(EXIT_FAILURE);
}
int i;
int buffer[BUF_SIZE] = {0};
for(i = 0; i < MAX; i++){
buffer[i%BUF_SIZE] = i;
if(i%BUF_SIZE == BUF_SIZE-1)
write(fd, buffer, sizeof(buffer));/*当缓冲区写满时向文件中写一次(刷新一次缓冲区)*/
}
close(fd);
return 0;
}
/*gcc -o test3 test3.c编译*/
写入效率测试结果:

加入自定义缓冲区后的测试发现,其效率比不加自定缓冲区要快100多倍,比标C写入速率也要快好几倍。如果缓冲区大小合适,其效率会提升更大。那么当我们将BUF_SZIE改为更大的值(BUF_SZIE=50000),重新编译之后,测试结果如下:

该效率由提高了,所以选择一个合适的缓冲区尤为重要。
标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)的更多相关文章
- 如何在Linux下添加函数库
如何为Linux增加库一. 静态库在Linux下的静态库是以.a为后缀的文件.1. 建静态库h1.c 源文件#include<stdio.h>void hello1(){printf(“t ...
- Linux下系统时间函数、DST等相关问题总结(转)
Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- 对于linux下system()函数的深度理解(整理)
原谅: http://blog.sina.com.cn/s/blog_8043547601017qk0.html 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同 ...
- 转:对于linux下system()函数的深度理解(整理)
这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...
- [转帖]Linux下fork函数及pthread函数的总结
Linux下fork函数及pthread函数的总结 https://blog.csdn.net/wangdd_199326/article/details/76180514 fork Linux多进程 ...
- (笔记)Linux下system()函数的深度理解(整理)
注:从其它地方转的非常好的一篇文章,值得深究! 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数 ...
- 【C/C++】Linux下system()函数引发的错误
http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食 恋恋美食 发布时间: 2012/04/21 11:3 ...
- linux下sprintf_s函数的替代
error code: ]; sprintf_s(buf, , "predicted position:(%3d, %3d)", predict_pt.x, predict_pt. ...
随机推荐
- Grep学习笔记
Grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具. 1. 正则表达式的基本组成部分 正则表达式 描述 ...
- elasticsearch-head插件安装说明
下载及安装readme https://github.com/mobz/elasticsearch-head 安装: npm install npm run start 访问:http://local ...
- c++刷题(12/100)无序数组中和为定值的最长子数组
题目一: 最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: ...
- Pythagorean Triples(Codeforces Round #368 (Div. 2) + 构建直角三角形)
题目链接: https://codeforces.com/contest/707/problem/C 题目: 题意: 告诉你直角三角形的一条边,要你输出另外两条边. 思路: 我们容易发现除2外的所有素 ...
- shell if判断中常用的a-z表达式含义
shell if判断中常用的a-z表达式含义 可通过在在linux中man test命令查看下列参数的详细用法 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 ...
- git之存储(git stash)-------(二)
关于git stash命令的使用方法网上一大把,我想记录的是我在使用过程中觉得实用及好用的: 当在一个分支的开发工作未完成,却又要切换到另外一个分支进行开发的时候,可以先将自己写好的代码,储存在一个箱 ...
- 零值比较--BOOL,int,float,指针变量与零值比较的if语句
这是程序员面试的一道常见题,也是个C++基础问题.若只在大学里看过几本基础的编程入门书,看见这道题可能会觉得奇怪,不就是和0比较吗,直接拿出来比就是了,其实非也.下文引自google搜索结果,出处不详 ...
- linux强制踢掉登录用户【转】
[root@Wang ~]# w :: up :, users, load average: 0.71, 0.58, 0.57 USER TTY FROM LOGIN@ IDLE JCPU PCPU ...
- Scala中的"null" 和“_”来初始化对象
Alternatives Use null as a last resort. As already mentioned, Option replaces most usages of null. I ...
- MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应解决方法
问题: MyEclipse中点击Deploy MyEclipse J2EE Project to Server无响应 解决方法: 如果工作空间的问题,那么需要删除你工作空间的一个文件就可以解决了.这个 ...