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 ++和硬件专家,所以我问你们,我如何才能加快速度并保持复制成功。
The code also check after each copystep if all bytes where written correctly, so that might also slow down the process.
您可以通过创建更大块的哈希来检查它。就像将文件分割成64M的块一样。然后匹配这些块的哈希值。 Bittorrent协议具有此功能。
如果有
另请注意,最新的操作系统在删除时会写入USB记忆棒。在删除之前,它只是将数据写入缓存中。因此从OS复制可能会更快。
那重叠的读写呢?
在当前代码中,总时间为
如果读写几乎同时花费了一半的时间。
您可以使用两个线程或异步IO来实现。不幸的是,线程和异步IO依赖于平台,因此您必须检查系统手册或选择适当的可移植库。
我只需要使用某些特定于OS的函数,这些函数肯定比仅使用c / c ++函数编写的函数要快。
对于Linux,这可以是sendfile函数。对于Windows,CopyFile将完成此工作。