最近作项目时觉得写大数据量写入时性能不行. 于是研究了 I/O stream buffer.
iso c中规定了standard io stream interface. 这部分实现在 glibc 中,于是研究了一下.
stream buffer 的分配不在fopen里. 是在第一次对文件写的时候. 大小为fstat得到的st_blksize(见_IO_file_doallocate).
fwrite逻辑为: 先往stream buffer 填, 如果填满了以后还有数据要写,则先flush一下, 然后判断剩余数据大小, 如果大于buffer 大小, 则以buffer 大小为倍数, 把整倍数的数据直接使用write写入. 最后剩下的数据才写入到 buffer 里( 见_IO_new_file_xsputn).
故如果以64k为单位写入ext3文件系统(st_blksize=4k), 则每次写入都对应两次write操作. 一次为4k , 一次为 60k.
iso c中规定了standard io stream interface. 这部分实现在 glibc 中,于是研究了一下.
stream buffer 的分配不在fopen里. 是在第一次对文件写的时候. 大小为fstat得到的st_blksize(见_IO_file_doallocate).
fwrite逻辑为: 先往stream buffer 填, 如果填满了以后还有数据要写,则先flush一下, 然后判断剩余数据大小, 如果大于buffer 大小, 则以buffer 大小为倍数, 把整倍数的数据直接使用write写入. 最后剩下的数据才写入到 buffer 里( 见_IO_new_file_xsputn).
故如果以64k为单位写入ext3文件系统(st_blksize=4k), 则每次写入都对应两次write操作. 一次为4k , 一次为 60k.