fopen读写文件之速度疑惑

时间:2022-09-04 19:19:09
如题。 
小弟在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倍左右),说明用了之后是把缓冲区中的数据写到磁盘上去了。 
读的时候是否也有相应的函数把之前打开的缓冲区清掉呢,真正的是从磁盘上读进来?

15 个解决方案

#1


先帮顶 
感觉读的速度跟写的速度应该差不多 读的时候应该是直接从缓冲区读的 
你试了清除完缓冲区之后 再读是什么样了吗

#2


引用楼主 saint_bxg 的帖子:
如题。 
小弟在Linux下写了一个测试读写文件速度的程序。先写文件,然后再读取。 
写文件是用fwrite函数,读文件用fread函数,时间的截取用gettimeofday函数。 
取时间方式是:先打开文件,然后取开始时间,写/读,然后关掉文件,再取结束时间,算得写/读文件所需时间。 
写完文件后,用sync(),刷一下缓冲,然后再close掉。 
读的时候就直接fopen,然后fread。 

现在的问题是: 
1.读/写 小文件速度较慢,大文件速度比…

这个应该跟文件管理系统的实现方法有关吧?
我记得以前我们平台的文件读写,从Norflash进行读写的,那就是写的比较快,读的比较慢。
因为它的实现是写直接就是整片区域整片区域的写,不用先写到缓存,然后再拷贝的。
而读则是挨着读的,且是先读到缓存,再由缓存读到显示的区域的,所以就慢了...
还有因为你直接调用的系统时间,这可能还涉及到此系统的中断调用关系,因为时间是在某个特定中断中进行计算的,万一读写正好用到这个中断,或正好屏蔽掉了这个中断...

#3


可以这样理解,就是说在磁盘的缓冲区起到了像cache一样的作用,当读的是候,一次读取缓冲区大小的数据可以减少miss的数量,但是写的时候,除了要写缓冲区外还用写磁盘,所以就会比读要慢。sync() 大概就是采用cache一样的write through,不用的话就是write back.

#4


使用 U 盘测试的结果是不准确的。由于U盘的工作方式与靠磁头读写数据的硬盘完全不同,现在的大部分 U 盘芯片针对读取作了优化,可以达到较高的读取速度,但写数据的速度则比较慢。这是硬件设计所致,并非你的程序或者系统造成的。

仔细察看你的 U 盘的参数的话,因该会发现 “读取速度xxx” 等,但一般不表明写数据的速度,因为,能快速“写”数据的U盘的价格要贵一些,都是商家玩的文字游戏。

#5


up

#6


试了一下单独读一文件(之前都是写完之后再读),总体来说速度也是非常快
第一次读的速度大概550M/S左右,而后若还是读这个文件,速度基本都是850M/S上下
再换一个文件读,结果基本相同。

于是我把电脑重启了一下,发现第一次读的速度变为44M/S,这个结果还差不多。
后面读的话,从显示上看,速度逐渐上升,280~450M/S

把文件改个名字再读,速度也基本上是280~450M/S

#7


mark

#8


又用了一下read函数(之前一直是用fread),结果差不多

#9


LZ去看看文件系统的实现便会明了。

读取块设备中文件的速度主要取决于高速缓冲块是否存在目标块。
更改名字对文件无影响,文件所对应的块设备逻辑块取决于它对应的i节点而非文件名字。

#10


fread 一定要缓存,速度会快很多

#11


可以参考 UNIX环境高级编程 第三章

#12


MARK

#13


访问磁盘的时间主要是: 磁头寻道时间数据传输时间.因此读操作会一次性读取多个扇区的数据,减少寻道时间.

读取的磁盘数据备份在系统缓冲区中,文件读写交互过程:用户程序->系统缓冲区->文件系统->磁盘驱动.

#14


mark

#15


up

#1


先帮顶 
感觉读的速度跟写的速度应该差不多 读的时候应该是直接从缓冲区读的 
你试了清除完缓冲区之后 再读是什么样了吗

#2


引用楼主 saint_bxg 的帖子:
如题。 
小弟在Linux下写了一个测试读写文件速度的程序。先写文件,然后再读取。 
写文件是用fwrite函数,读文件用fread函数,时间的截取用gettimeofday函数。 
取时间方式是:先打开文件,然后取开始时间,写/读,然后关掉文件,再取结束时间,算得写/读文件所需时间。 
写完文件后,用sync(),刷一下缓冲,然后再close掉。 
读的时候就直接fopen,然后fread。 

现在的问题是: 
1.读/写 小文件速度较慢,大文件速度比…

这个应该跟文件管理系统的实现方法有关吧?
我记得以前我们平台的文件读写,从Norflash进行读写的,那就是写的比较快,读的比较慢。
因为它的实现是写直接就是整片区域整片区域的写,不用先写到缓存,然后再拷贝的。
而读则是挨着读的,且是先读到缓存,再由缓存读到显示的区域的,所以就慢了...
还有因为你直接调用的系统时间,这可能还涉及到此系统的中断调用关系,因为时间是在某个特定中断中进行计算的,万一读写正好用到这个中断,或正好屏蔽掉了这个中断...

#3


可以这样理解,就是说在磁盘的缓冲区起到了像cache一样的作用,当读的是候,一次读取缓冲区大小的数据可以减少miss的数量,但是写的时候,除了要写缓冲区外还用写磁盘,所以就会比读要慢。sync() 大概就是采用cache一样的write through,不用的话就是write back.

#4


使用 U 盘测试的结果是不准确的。由于U盘的工作方式与靠磁头读写数据的硬盘完全不同,现在的大部分 U 盘芯片针对读取作了优化,可以达到较高的读取速度,但写数据的速度则比较慢。这是硬件设计所致,并非你的程序或者系统造成的。

仔细察看你的 U 盘的参数的话,因该会发现 “读取速度xxx” 等,但一般不表明写数据的速度,因为,能快速“写”数据的U盘的价格要贵一些,都是商家玩的文字游戏。

#5


up

#6


试了一下单独读一文件(之前都是写完之后再读),总体来说速度也是非常快
第一次读的速度大概550M/S左右,而后若还是读这个文件,速度基本都是850M/S上下
再换一个文件读,结果基本相同。

于是我把电脑重启了一下,发现第一次读的速度变为44M/S,这个结果还差不多。
后面读的话,从显示上看,速度逐渐上升,280~450M/S

把文件改个名字再读,速度也基本上是280~450M/S

#7


mark

#8


又用了一下read函数(之前一直是用fread),结果差不多

#9


LZ去看看文件系统的实现便会明了。

读取块设备中文件的速度主要取决于高速缓冲块是否存在目标块。
更改名字对文件无影响,文件所对应的块设备逻辑块取决于它对应的i节点而非文件名字。

#10


fread 一定要缓存,速度会快很多

#11


可以参考 UNIX环境高级编程 第三章

#12


MARK

#13


访问磁盘的时间主要是: 磁头寻道时间数据传输时间.因此读操作会一次性读取多个扇区的数据,减少寻道时间.

读取的磁盘数据备份在系统缓冲区中,文件读写交互过程:用户程序->系统缓冲区->文件系统->磁盘驱动.

#14


mark

#15


up