W WilliamGui Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-13 #21 毫无疑问使用API是效率最快的!但想同时...
H hxy2002 Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-14 #22 如果光驱和硬盘都接在一个不同的IDE口,让两个设备双工,就像GGCAT所说的。 这样会加快文件的复制吗?
Q qince Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-14 #23 会的,而且本身光驱和硬盘就不要接在同一个IDE线上,还有最好打开光驱的DMA,这样还会快一些.
S szxt168 Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-15 #24 光驱和硬盘的速度不是一个数量级别的,最大52*0.15=7.8m,ide 7200 30~50M/s。我觉得这个提法很不错,但受限于硬件性能,不会有很明显的效果。
张 张无忌 Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-15 #25 呵呵,一个线程就够了,这个速度和硬盘有关系的,IDE硬盘可以说是单线程工作的, 具体原因以前的帖子里讨论过的。
H hxy2002 Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-15 #26 TO:张无忌 我是从光驱读,硬盘写的。 不是都在一个硬盘读和写的。
M masm Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-15 #27 多线程读写文件?嗬嗬,除非自己写raid系统! 用文件内存映像最快!过程如下: CreateFileMapping MapViewOfFile 映像源文件 创建目标文件,关闭再打开(这一点很重要,如果没有这一步,看起来代码没有冗余,但执行效率会降低1倍,具体原因我不知道!),建立目标文件的内存映像,注意文件大小和源文件一样!! 把源文件映像的字节拷贝至目标文件字节,可用汇编,呵呵 UnmapViewOfFile 关闭两个文件 就可以了 我试过,和windows系统拷贝文件速度一样!!
多线程读写文件?嗬嗬,除非自己写raid系统! 用文件内存映像最快!过程如下: CreateFileMapping MapViewOfFile 映像源文件 创建目标文件,关闭再打开(这一点很重要,如果没有这一步,看起来代码没有冗余,但执行效率会降低1倍,具体原因我不知道!),建立目标文件的内存映像,注意文件大小和源文件一样!! 把源文件映像的字节拷贝至目标文件字节,可用汇编,呵呵 UnmapViewOfFile 关闭两个文件 就可以了 我试过,和windows系统拷贝文件速度一样!!
G GGCAT Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-15 #29 是这样的读写都需要一定的时间,而且现在的硬盘数据都是采用的DMA传输,在读写的时候,只有操作该I/O的线程挂起等待数据,CPU则被释放出来。 当单线程来进行操作时,每个数据块要经历读数据和写数据的两个序列化阶段,考虑到硬盘的写速度比读慢,因此至少需要两个写操作的时间。如果读写线程并列的话,这两个阶段就会重叠(条件是读写是发生在两个单独的数据通道)。实际测试,在我的机器上。从7200rpm的硬盘复制到4500rpm的硬盘,单线程只能跑到12MB/S,双线程跑到了16MB/S,接近了写硬盘的峰值速度。反过来从4500rpm->7200rpm则跑到了22MB/S。 当然了,从CD-ROM复制的速度肯定没这么快,但是如果真的是从CD-ROM来读的话,双线程绝对是有意义的,可以避免因为写过程的短暂等待导致光驱再次读数据的启动延迟,光驱的寻道是很慢的哦。现在光驱基本可以做到48X读,综合内外圈因素平均速度在30x左右,大概是4.5MB/S,我想双线程应该可以达到这个理想值。
是这样的读写都需要一定的时间,而且现在的硬盘数据都是采用的DMA传输,在读写的时候,只有操作该I/O的线程挂起等待数据,CPU则被释放出来。 当单线程来进行操作时,每个数据块要经历读数据和写数据的两个序列化阶段,考虑到硬盘的写速度比读慢,因此至少需要两个写操作的时间。如果读写线程并列的话,这两个阶段就会重叠(条件是读写是发生在两个单独的数据通道)。实际测试,在我的机器上。从7200rpm的硬盘复制到4500rpm的硬盘,单线程只能跑到12MB/S,双线程跑到了16MB/S,接近了写硬盘的峰值速度。反过来从4500rpm->7200rpm则跑到了22MB/S。 当然了,从CD-ROM复制的速度肯定没这么快,但是如果真的是从CD-ROM来读的话,双线程绝对是有意义的,可以避免因为写过程的短暂等待导致光驱再次读数据的启动延迟,光驱的寻道是很慢的哦。现在光驱基本可以做到48X读,综合内外圈因素平均速度在30x左右,大概是4.5MB/S,我想双线程应该可以达到这个理想值。
H hxy2002 Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-15 #30 同意GCCAT的说法。 现在就差代码了. 看实际效果如何了。
Z zqw0117 Unregistered / Unconfirmed GUEST, unregistred user! 2003-12-21 #31 代码很简单,还是用 CreateFileMapping MapViewOfFile 建立两个内存块(实际大小是你读取分段数据的大小+1,这样可以让最后一个字节作为读取完成的操作标识符,读取完成就把最后一个字节改成非0,正在读取就把最后一个字节改成0),建立完成后,首先清空内存块内的垃圾数据,然后启动读线程,让读线程读取光盘数据,保存到第一个内存块里面,保存完毕后, 继续让一个线程往第二块内存中写数据,同时把第一块内存的最后一个表示字节改成非0,再立刻启动写线程,写线程判断第一块内存的标识符是否是非0,如果是,就Copy整个内存块到磁盘上,并最后改内存块最后一个字节为0,接着写线程去检查第二块内存是否读出完毕(就是检查第二块内存的标识符字节)。依次循环,直到两个内存块数据全部读写完毕,并被终止,即可完成这个操作。
代码很简单,还是用 CreateFileMapping MapViewOfFile 建立两个内存块(实际大小是你读取分段数据的大小+1,这样可以让最后一个字节作为读取完成的操作标识符,读取完成就把最后一个字节改成非0,正在读取就把最后一个字节改成0),建立完成后,首先清空内存块内的垃圾数据,然后启动读线程,让读线程读取光盘数据,保存到第一个内存块里面,保存完毕后, 继续让一个线程往第二块内存中写数据,同时把第一块内存的最后一个表示字节改成非0,再立刻启动写线程,写线程判断第一块内存的标识符是否是非0,如果是,就Copy整个内存块到磁盘上,并最后改内存块最后一个字节为0,接着写线程去检查第二块内存是否读出完毕(就是检查第二块内存的标识符字节)。依次循环,直到两个内存块数据全部读写完毕,并被终止,即可完成这个操作。