Chinaunix
标题:
stdio对比unistd仅仅是多了一层缓存么?
[打印本页]
作者:
asker160
时间:
2012-03-09 22:47
标题:
stdio对比unistd仅仅是多了一层缓存么?
fwrite和write相比,仅仅是fwrite多了一层用户级的缓存? 不同每次写入都要从用户切换到内核态,然后再回来,而是写满了stdio的缓存(512byte)以后再flush到内核?
如果我说的是正确地,那么当我fwrite每次写入的量都比较大(写入的原子远大于512byte)的时候,这个所谓的stdio的缓存,岂不是一点用都没有,平添了系统负担,反而比我直接write()更慢了?
我的这个说法有没有问题? 什么情况下fwrite的性能不如直接使用write(),fread()的性能不如直接使用read()?
作者:
timespace
时间:
2012-03-09 22:47
用途:
fwrite是给整个星球的人用,没假设你一次写多大的数据块,正所谓通用
而且这个“512B”和编译器或OS或存储设备有很大关系,对应用程序来说应该透明
如果你很明白的自己应用场景,写数据块很大,那直接用write就完事了,没什么好顾虑的
性能:
这经常被夸大了,你程序的瓶颈在于fwrite与write的性能差别吗?
至于系统IO与标准IO性能实测,APUE第3章和第5章有详尽描述,请参考
因为标准IO缓存都设置了最佳IO大小(如单页4K,可以看FILE结构的成员st_blksize)
当数据块接近st_blksize时,fwrite/write非常接近,几无差别
当数据块很大(比st_blksize),直接write更快,write只需一次系统调用,而直接fwrite需要多次系统调用
当数据块很小(比st_blksize),直接fwrite更快,fwrite多次才会有一次系统调用,而直接write需要更多次系统调用
fread与read同理
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2