当前位置: 技术问答>linux和unix
使用标准IO的误区
来源: 互联网 发布时间:2016-10-01
本文导语: 原创 使用标准IO的误区 收藏 不知道大家有没有这种习惯,在使用标准IO库写文件时还喜欢另外开辟一个大的缓存区来缓存要写的数据,待这个大的缓存区满了以后再调用 fwrite/fread来进行IO操作,以为这样可以减...
原创 使用标准IO的误区 收藏
不知道大家有没有这种习惯,在使用标准IO库写文件时还喜欢另外开辟一个大的缓存区来缓存要写的数据,待这个大的缓存区满了以后再调用 fwrite/fread来进行IO操作,以为这样可以减少IO次数。但实际情况却不是这样的,因为标准IO中已经有一个缓存了,缓存的大小设置为操作系统一次写硬盘的字符数。上述做法,相当于在用户态环境下多做了一次无无谓的内存拷贝操作。
我在linux环境下写了一个例子来验证我的想法,例子:
不知道大家有没有这种习惯,在使用标准IO库写文件时还喜欢另外开辟一个大的缓存区来缓存要写的数据,待这个大的缓存区满了以后再调用 fwrite/fread来进行IO操作,以为这样可以减少IO次数。但实际情况却不是这样的,因为标准IO中已经有一个缓存了,缓存的大小设置为操作系统一次写硬盘的字符数。上述做法,相当于在用户态环境下多做了一次无无谓的内存拷贝操作。
我在linux环境下写了一个例子来验证我的想法,例子:
/*****************************************************************
* Copyright (c) 2010, All rights reserved.
* 文件摘要:该代码文件用来验证使用标准IO/多块标准IO/直接系统调用
* 为了简洁起见代码中没有做错误处理
*****************************************************************/
#include
#include
#include
#include
using namespace std;
#define LOOP_TIME 9999999
#define OUTPUT_FILE "/data/cjdev/jiangf/io.output"
char strBuffer[1024];
/*单纯使用标准io库*/
void stdioLib()
{
struct timeval tpBegin;
struct timeval tpEnd;
memset(&tpBegin,0,sizeof(tpBegin));
memset(&tpEnd,0,sizeof(tpEnd));
gettimeofday(&tpBegin,NULL);
FILE *fp=fopen("/data/cjdev/jiangf/io.output1","w");
for(int i=0;i