Chinaunix首页 | 论坛 | 博客
  • 博客访问: 66594
  • 博文数量: 30
  • 博客积分: 1260
  • 博客等级: 中尉
  • 技术积分: 285
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-03 12:27
文章分类

全部博文(30)

文章存档

2010年(30)

我的朋友

分类: LINUX

2010-07-22 15:47:29

1。缓冲
   在文件I/O的效率《UNIX环境高级编程》中可以看到对于不同的BUFFSIZE,效率是不一样的,作者从用户CPU、系统CPU、时钟时间、循环次数方面进行比较,发现系统CPU时间的最小值出现在BUFFSIZE为4096处,继续增加缓冲区长度对此时间几乎没有影响。
   标准I/O库提供缓冲的目的就是尽可能减少使用read和write调用的次数,从而尽可能减少系统CPU时间,从而提高效率。
   标准I/O提供了三种类型的缓冲:
  • 全缓冲,在这种情况下,在填满标准I/O缓冲区后才进行实际的I/O操作,填满一个缓冲区后,标准I/O例程会自动flush缓冲区,当然用户也可以调用fflush()函数强制刷新缓冲区
  • 行缓冲,在这种情况下,当在输入或输出时遇到换行符时,标准I/O库执行I/O操作,这允许我们使用标准I/O函数fputc()一次输出一个字符,直到换行符或停止符时才进行实际的I/O操作。要注意的是,因为标准I/O库用来收集每一行的缓冲区的长度是固定的,所以只要填满了缓冲区,那么即使还没有写一个换行符,也进行I/O操作。
  • 不带缓冲,比如标准出错流stderr通常是不带缓冲的。

   可以使用setbuf()或setvbuf()设置缓冲,一般而言,应由系统选择缓冲区的长度,并自动分配缓冲区,在这种情况下关闭此流时,标准I/O库将自动释放缓冲区.

2.效率

   主要从读写流方面来考察标准I/O的效率问题,打开流后,有三种不同类型的非格式化I/O进行选择

  • 每次读写一个字符,主要是fgetc()与fputc()函数
  • 每次一行,主要是fgets()与fputs()函数
  • 直接I/O,函数fread和fwrite支持这种用法

   从统计来讲,标准I/O性能是一定差于直接使用read和write的I/O操作,同时fgetc又差于fgets,效率不高与其需要复制的数据量有关系(fgets或fputs需要复制两次数据),因此出现在快速I/O(fio)、sfio等变种。

阅读(1135) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~