当前位置: 技术问答>linux和unix
linux下读写文件之速度疑惑
来源: 互联网 发布时间:2016-07-02
本文导语: 如题。 小弟在Linux下写了一个测试读写文件速度的程序。先写文件,然后再读取。 写文件是用fwrite函数,读文件用fread函数,时间的截取用gettimeofday函数。 取时间方式是:先打开文件,然后取开始时间,写/读,然后...
如题。
小弟在Linux下写了一个测试读写文件速度的程序。先写文件,然后再读取。
写文件是用fwrite函数,读文件用fread函数,时间的截取用gettimeofday函数。
取时间方式是:先打开文件,然后取开始时间,写/读,然后关掉文件,再取结束时间,算得写/读文件所需时间。
写完文件后,用sync(),刷一下缓冲,然后再close掉。
读的时候就直接fopen,然后fread。
现在的问题是:
1.读/写 小文件速度较慢,大文件速度比较快
2.写的速度比较慢(相对来说比较正常,用U盘来测,3.X M/S),读的速度非常快800~900多M/S,怀疑是读的时候,直接从缓冲区中读出了。其中一个现象是写文件在本地磁盘,写的速度是三十几兆/S,读的速度是870多兆/S;写文件在U盘上,写的速度是3.x/S,读的速度是接近900兆/S。
写的时候用和不用sync()差别很大(10倍左右),说明用了之后是把缓冲区中的数据写到磁盘上去了。
读的时候是否也有相应的函数把之前打开的缓冲区清掉呢,真正的是从磁盘上读进来?
小弟在Linux下写了一个测试读写文件速度的程序。先写文件,然后再读取。
写文件是用fwrite函数,读文件用fread函数,时间的截取用gettimeofday函数。
取时间方式是:先打开文件,然后取开始时间,写/读,然后关掉文件,再取结束时间,算得写/读文件所需时间。
写完文件后,用sync(),刷一下缓冲,然后再close掉。
读的时候就直接fopen,然后fread。
现在的问题是:
1.读/写 小文件速度较慢,大文件速度比较快
2.写的速度比较慢(相对来说比较正常,用U盘来测,3.X M/S),读的速度非常快800~900多M/S,怀疑是读的时候,直接从缓冲区中读出了。其中一个现象是写文件在本地磁盘,写的速度是三十几兆/S,读的速度是870多兆/S;写文件在U盘上,写的速度是3.x/S,读的速度是接近900兆/S。
写的时候用和不用sync()差别很大(10倍左右),说明用了之后是把缓冲区中的数据写到磁盘上去了。
读的时候是否也有相应的函数把之前打开的缓冲区清掉呢,真正的是从磁盘上读进来?
|
Unix systems allow the deferred writes of dirty pages into block devices,
because this noticeably improves system performance. Several write operations
on a page in cache could be satisfied by just one slow physical update of the
corresponding disk sectors. Moreover, write operations are less critical than
read operations, because a process is usually not suspended due to delayed
writings, while it is most often suspended because of delayed reads. Thanks to
deferred writes, each physical block device will service, on the average, many
more read requests than write ones.
Excerpt from ULK3 ch15.3
because this noticeably improves system performance. Several write operations
on a page in cache could be satisfied by just one slow physical update of the
corresponding disk sectors. Moreover, write operations are less critical than
read operations, because a process is usually not suspended due to delayed
writings, while it is most often suspended because of delayed reads. Thanks to
deferred writes, each physical block device will service, on the average, many
more read requests than write ones.
Excerpt from ULK3 ch15.3
|
如果,你要做这种测试..
不要用f开关的函数.
read write 缓冲自己定
fread读的时候,会自动清空的.
磁盘读的速度,本来就比写快.
sync只是强制同步文件...也就是强制把文件所有改动同步到硬盘.
要真的写做测试..
建议用mmap
不要用f开关的函数.
read write 缓冲自己定
fread读的时候,会自动清空的.
磁盘读的速度,本来就比写快.
sync只是强制同步文件...也就是强制把文件所有改动同步到硬盘.
要真的写做测试..
建议用mmap
|
不要用f
用read,write
sync只是强制同步.
读比来就比写快..快得多.
真的想测试 用mmap
用read,write
sync只是强制同步.
读比来就比写快..快得多.
真的想测试 用mmap
|
这个可能跟你每次读写的块的大小也有关系,这一点在APUE2nd的第三章 FILE I/O和第五章 Standard I/O Library有说。
还有那本书里提到的buffering 和 unbuffer的差异
还有那本书里提到的buffering 和 unbuffer的差异