系统调用与库函数对于不同bufSize写文件耗时对比
By wangshudian@ gmail.com
一、实验说明
函数原型:
int write(int fd, char *buf, unsigned bufSize);
int fwrite(char *ptr, unsigned size, unsigned n, FILE *fp);
函数特点:
系统调用write是unbuffered的;
库函数fwrite是buffered的。
参考文献:
李梦雨《文件IO函数和标准IO库函数的读写效率研究》
下面基本书对系统调用与库函数的联系和区别也有讲解:
《C专家编程》
《程序员的自我修养》
《Beginning Linux Programming》
二、实验数据
我上传到附件了:
http://download.csdn.net/detail/autoca/4349293
三、观察分析
(1)对于系统调用write,当入参buffer size远小于文件系统的block size(4096字节)时,效率极低;当入参buffer size接近或大于block size时效率接近最优。
(2)对于库函数fwrite,入参buffer size(size*n)的变化对写文件效率影响不明显,其效率高于write最优值的1/2(想必是fwrite对write做了封装,多了一层调用,于是表现出1/2的关系)。
三、实验结论
如果是多次循环,每次只写少量字符,那么库函数效率高。
如果循环次数少,每次都写大块数据,那么系统调用效率高。
在对效率有特殊要求的场合,建议使用write且必须选取最优buffer size。
对于一般应用,建议使用标准库函数,无需多虑。