关于C ++:通过fread / fwrite将文件复制到USB的性能

Performance of copying a file with fread/fwrite to USB

我在一段代码的前面,该代码将文件复制到USB设备。
以下部分是重要的部分:

1
2
3
4
5
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 ++和硬件专家,所以我问你们,我如何才能加快速度并保持复制成功。


  • 尝试大块读写。 16M,32M??可以复制文件。
  • 如果您只想复制文件,则可以随时调用system(),它将更快。
  • The code also check after each copystep if all bytes where written correctly, so that might also slow down the process.

    您可以通过创建更大块的哈希来检查它。就像将文件分割成64M的块一样。然后匹配这些块的哈希值。 Bittorrent协议具有此功能。

  • 如果有mmapMapViewOfFile可用,请首先映射文件。然后将其写入USB。这种方式的读操作将由内核处理。

  • Kerrek刚刚评论了在mmap上使用memcpy的情况。带有2个mmap文件的memcpy看起来很棒。
  • 另请注意,最新的操作系统在删除时会写入USB记忆棒。在删除之前,它只是将数据写入缓存中。因此从OS复制可能会更快。


    那重叠的读写呢?

    在当前代码中,总时间为time(read original) + time(write copy),如果您读取了第一个块,则在写入时开始读取第二个块,依此类推。您的总时间为max(time(read original), time(write copy))(加上读取/写入第一个和第二个块的时间)最后一个不会被流水线的块)。

    如果读写几乎同时花费了一半的时间。

    您可以使用两个线程或异步IO来实现。不幸的是,线程和异步IO依赖于平台,因此您必须检查系统手册或选择适当的可移植库。


    我只需要使用某些特定于OS的函数,这些函数肯定比仅使用c / c ++函数编写的函数要快。

    对于Linux,这可以是sendfile函数。对于Windows,CopyFile将完成此工作。