我们都知道,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下系统函数库 区别 (即带不带缓冲区的学习)的更多相关文章

  1. 如何在Linux下添加函数库

    如何为Linux增加库一. 静态库在Linux下的静态库是以.a为后缀的文件.1. 建静态库h1.c 源文件#include<stdio.h>void hello1(){printf(“t ...

  2. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  3. Linux下c函数dlopen实现加载动态库so文件代码举例

    dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...

  4. 对于linux下system()函数的深度理解(整理)

    原谅: http://blog.sina.com.cn/s/blog_8043547601017qk0.html 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同 ...

  5. 转:对于linux下system()函数的深度理解(整理)

    这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数中调用的命令也都一切正常.就没理这个bug,以为 ...

  6. [转帖]Linux下fork函数及pthread函数的总结

    Linux下fork函数及pthread函数的总结 https://blog.csdn.net/wangdd_199326/article/details/76180514 fork Linux多进程 ...

  7. (笔记)Linux下system()函数的深度理解(整理)

    注:从其它地方转的非常好的一篇文章,值得深究! 这几天调程序(嵌入式linux),发现程序有时就莫名其妙的死掉,每次都定位在程序中不同的system()函数,直接在shell下输入system()函数 ...

  8. 【C/C++】Linux下system()函数引发的错误

    http://my.oschina.net/renhc/blog/54582 [C/C++]Linux下system()函数引发的错误 恋恋美食  恋恋美食 发布时间: 2012/04/21 11:3 ...

  9. linux下sprintf_s函数的替代

    error code: ]; sprintf_s(buf, , "predicted position:(%3d, %3d)", predict_pt.x, predict_pt. ...

随机推荐

  1. AspNetPager + GridView + ASP.NET AJAX 分页无刷新实现

    准备资源: AspNetPager 下载网址:http://www.webdiyer.com/download/default.aspx ASP.NET AJAX  下载网址:http://www.a ...

  2. BZOJ1822 Frozen Nova 冷冻波

    1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec  Memory Limit: 64 MB Description WJJ喜欢“魔兽争霸”这个游戏. ...

  3. POJ 3255 Roadblocks (次短路 SPFA )

    题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...

  4. sklearn_SVC_支持向量机

    # coding:utf-8 import numpy as np from sklearn.svm import SVC import matplotlib.pyplot as plt #生成数据 ...

  5. php 传递赋值和地址赋值 &

    更多内容推荐微信公众号,欢迎关注: 1.传递赋值 $a = 1; $b = 2; $a = $b; echo $a,$b; //结果为:5 5 2.地址赋值 $a = 1; $b = 2; $a = ...

  6. aarch64_m1

    MAKEDEV-3.24-18.fc26.aarch64.rpm 2017-02-14 08:46 99K fedora Mirroring Project MUMPS-5.0.2-8.fc26.aa ...

  7. 三、springcloud之服务调用Feign

    一.背景 项目中接口调用: Httpclient Okhttp Httpurlconnection RestTemplate 微服务提供了更简单,方便的Feign 二.Feign简介 Feign是一个 ...

  8. python网络编程-多进程multiprocessing

    一:mutilprocess简介 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去 ...

  9. MongoDB中多表关联查询(

    1.使用aggregate 查看表数据 db.getCollection('reports').aggregate([ { $lookup: { from: "process", ...

  10. luogu P3393 逃离僵尸岛

    luoguP3393逃离_僵尸岛_ 一道洛谷不知道哪门子月赛的题 可以用此题来练习最短路算法 SPFA和dijkstra的练习题(关于Floyed,他死了 思路: 本题是最短路板子. 首先就是建立虚点 ...