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等变种。
阅读(1167) | 评论(0) | 转发(0) |