打印

WINDOWS写U盘的速度究竟有多慢,谁能给个解释?!

[复制链接]
2812|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
db200|  楼主 | 2007-10-21 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题背景:在程序中读写U盘的事做过很多次了,和读写硬盘一样,没有遇到什么特别的问题,所以没有在意。而这次,是要操作U盘里的一个大文件,比如600M,打开这个文件之后,我要每隔1M字节写1个扇区(512字节),结果发现每写1个扇区的时间是120ms,也就是说写入速度是5K字节/S,而我采用大数据块方式写这个U盘时的速度至少是1M字节/S。我想一定是我的操作有问题,但我没想到问题竟是这么复杂。
(1)我换了其它U盘,现象一样,排除了U盘的问题。
(2)我的U盘是2G,FAT16,每簇32K字节。我的操作系统是WIN2000。
(3)以下的测试这样来做:连续写100次,每次512字节(共51K字节),每写1次之后就将文件指针向后移动1M字节。耗时12s。
(3)尝试改变creatfile打开文件的方式,选择 无缓冲、为连续读写优化、为随机读写优化、独占方式打开,以上这些方式组合,某些情况下,程序本身可以快速返回,但是程序返回后U盘的灯一直在闪,估计是操作系统在后台写,实际花的时间和原来一样长。
(4)测试写100个扇区,但扇区中间无间隔,是连续的,速度很快,总耗时约250ms。
(5)仍然是间隔1M字节,但不是写,而是读100次,速度很块,耗时约100ms。
(6)仍然是间隔1M字节写100次,但每次写的不是512字节,而是1K或更多,结果发现:每次写的只要在128K字节以内,时间是差不多的。也就是说写1个扇区和写256个扇区花费相同的时间。
(7)难道是因为WINDOWS的缓冲机制的问题?尝试采用文件内存映射方式,先将所有的修改提交到内存映射文件中,最后1次刷新到U盘文件,结果时间差不多。
(8)尝试在WINDOWS下直接磁盘扇区读写方式,直接写物理扇区,测试的结果和前面相同。
(9)难道说每次要操作系统写1扇区时,它都会缓存或者写U盘128K字节?否则为什么写512字节和写128K字节时间是一样的呢?能否这样来测试:1次提交一个大数据块,但是操作系统要把它写到分散的扇区中,这样操作系统不会傻到每写1个分散的扇区还去缓存一大堆数据了吧?
    实验这样做:我采用直接物理扇区读写方式,通过直接修改FAT中的文件簇链,创建了1个10M的文件,这个文件很特别,它在U盘上的位置非常不连续,共占据320个32K字节的簇、而相临的2簇之间在物理上相隔32个簇(1M字节)。然后我创建1个和文件一样大的数据块,一次写到文件,结果是:耗时395S,约120ms/簇,和前面的速度一样。
(10)众所周知,写U盘的1个扇区,不可能花费120ms的时间,我用单片机做的读写SD卡的东西,同样写零散的扇区,也只需要2ms。WINDOWS写U盘时究竟干了些什么?!各位大哥大姐,能否给个说得通的解释??

相关帖子

沙发
devusb| | 2007-10-23 21:02 | 只看该作者

U盘控制器在操作FLASH时引起的,WINDOWS对速度的影响关系不大

使用特权

评论回复
板凳
平常人| | 2007-10-23 22:45 | 只看该作者

LZ何必一个帖到处发呢?是要别人追你的问题答呢?还是你追

有人知道或愿意回答,放哪里都一样。

使用特权

评论回复
地板
computer00| | 2007-10-23 23:01 | 只看该作者

你知道NAND falsh一次擦除是按什么为单位的吗?

虽然你只写512字节,可是U盘操作时,还得将这一整个块的内容先copy下来,然后再擦掉原来
的块,再使用新的512字节和原来的内容填充到原来的块中.


另外,在多文件复制时,要不停的更新FAT表和目录, 这个是很耗时的。所以很多小文件时,
最好打包后再复制到U盘中。

使用特权

评论回复
5
hotpower| | 2007-10-23 23:49 | 只看该作者

总比SPI SD快多了~~~

使用特权

评论回复
6
xwj| | 2007-10-23 23:56 | 只看该作者

LS,不见得

使用特权

评论回复
7
hotpower| | 2007-10-24 00:01 | 只看该作者

肯定有以外~~~假如高速SPI肯定比低速IO快多了~~~

400K~~~

使用特权

评论回复
8
xplore| | 2007-10-26 12:11 | 只看该作者

隔1M写的话

基本上是每次要写16KB或128KB

现在的U盘,一般每次要写128KB, 所以实际速度算是128KB/120ms,折算成1MB/s的样子。


所以U盘完全正常,尽管这个U盘还是算很慢(可能usb是1.1的原因)

你的软件要读写U盘, 应该修改软件, 读写时尽量集中, 不要那么分散。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

75

帖子

0

粉丝