[英]Performance of copying a file with fread/fwrite to USB
我在一段代码的前面,该代码将文件复制到USB设备。 以下部分是重要的部分:
while((bytesRead = fread(buf, 1, 16*1024, m_hSource)) && !bAbort) {
// write to target
long bytesWritten = fwrite(buf, 1, bytesRead, m_hTarget);
m_lBytesCopied += bytesWritten;
客户说这件事,与正常的pc <-> usb速度相比,它相当慢。 我没有编写代码,所以优化是我的工作。
所以我想知道,这是一个更好的方法,首先读取完整的文件,然后一步一步写入文件。 但是我不知道这将是多么容易出错。 该代码还会在每个复制步骤之后检查所有字节是否均已正确写入,从而也可能减慢该过程。
我不是那个c ++和硬件专家,所以我问你们,我如何才能加快速度并保持复制成功。
system()
它将更快。 该代码还会在每个复制步骤之后检查所有字节是否均已正确写入,从而也可能减慢该过程。
您可以通过创建更大块的哈希来检查它。 就像将文件分割成64M的块一样。 然后匹配这些块的哈希值。 Bittorrent协议具有此功能。
如果您有mmap
或MapViewOfFile
可用,请先映射文件 。 然后将其写入USB。 这种读取操作将由内核处理 。
mmap
上使用memcpy
情况。 具有2个mmap
ed文件的memcpy
看起来很棒。 另请注意,最新的操作系统在被删除时会写入USB记忆棒。 在删除之前,它只是将数据写入缓存中。 因此从OS复制可能会更快。
那重叠的读写呢?
在当前代码中,总时间为time(read original) + time(write copy)
,如果您读取了第一个块,则在写入时开始读取第二个块,依此类推。总时间为max(time(read original), time(write copy))
(加上读/写不会流水线的第一个和最后一个块的时间)。
如果读写几乎同时花费了一半的时间。
您可以使用两个线程或异步IO来实现。 不幸的是,线程和异步IO依赖于平台,因此您必须检查系统手册或选择适当的可移植库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.