代码之家  ›  专栏  ›  技术社区  ›  Assaf Lavie

多线程文件复制优化

  •  3
  • Assaf Lavie  · 技术社区  · 16 年前

    可以通过多线程加快文件复制速度吗?

    编辑 :为了澄清,假设您正在实现copyfile(src,tgt)。在某些情况下,您可以使用多个线程来加快速度,这似乎是合乎逻辑的。

    编辑 还有一些想法:

    当然,这取决于所讨论的硬件/存储。

    例如,如果您要从一个磁盘复制到另一个磁盘,那么很明显,您可以使用两个线程同时读/写,从而节省两个线程中最快的线程(通常是读)的性能成本。但是您不需要多个线程来并行读/写,只需要异步IO。

    但是,如果异步IO在从不同磁盘读/写时能够真正加快速度(高达2倍),为什么这不是copyfile的默认实现?(或者是?)

    6 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    8 年前

    您可以看到一个好处,特别是如果文件在不同的设备上,在这种情况下,I/O可以非常有效地重叠。

    然而,也有一些情况下,您可以很容易地导致硬件抖动,所以我不认为这是一个应该轻视的优化。

    至于您添加的附加问题:

    但是如果异步IO真的可以加速 当 从不同的磁盘读/写, 为什么这不是默认值? 拷贝文件的实现?(或) 它?)

    我不知道 CopyFile() 但如果他们不这么做,我不会感到惊讶,因为以下几个原因:

    1. 如果他们使用一个额外的线程(或多个线程)来实现它,那么这个线程对一个进程的干扰可能会比合适的多一些(特别是当进程是单线程的时候)。
    2. 如果他们试图用一个线程的异步I/O来实现它(如 ChrisW indicated 这是一种可能性),它们可能会导致震荡问题,并提高性能。一般来说,要确定什么时候能得到好处而不是损害可能并不容易。

    这并不是说它不能或不应该做(甚至它没有做——我不知道)——这只是一些可能的原因,为什么不能做。

        2
  •  4
  •   Otávio Décio    16 年前

    如果你不小心,你可以让它慢一点。磁盘擅长序列化访问,如果您有多个线程,那么磁盘头将到处都是。现在,如果您处理的是高性能SAN,那么您的性能可能会有所提高,而SAN将处理优化磁盘访问。

        3
  •  3
  •   Nir    16 年前

    以下是一篇关于VistaSP1中文件复制性能改进的博客文章:

    http://blogs.technet.com/markrussinovich/archive/2008/02/04/2826167.aspx

    做高性能的文件复制是疯狂的,你必须考虑缓存行为和网络驱动程序的限制。

    所以一定要使用操作系统的文件复制功能(在Windows下它是filecopyex),不要自己写。

        4
  •  2
  •   sblundy    16 年前

    我想不会。CPU所能做的太少了。

        5
  •  1
  •   Nir    16 年前

    这取决于,但通常不会,您的瓶颈将是磁盘IO,使用多个线程不能使磁盘IO更快。

    即使在极为罕见的情况下,线程同步代码也会非常复杂,不值得这样做。

        6
  •  1
  •   ChrisW    16 年前

    如果您正在实现copyfile,那么您可以使用一个线程来初始化,而不是使用多个线程(例如,一个线程用于读取,另一个线程用于写入)。 异步的 I/O(这样一个线程可以同时启动/重新启动读和写),使用完成端口或其他任何端口。

    为了提高性能,它可能完全在内核中实现。