5

マルチスレッドでファイルのコピーを高速化できますか?

編集: 明確にするために、CopyFile(src, tgt) を実装しているとします。特定の状況下では、複数のスレッドを使用して高速化できることは論理的に思えます。

編集いくつかの考え:

当然、問題のハードウェア/ストレージによって異なります。

たとえば、あるディスクから別のディスクにコピーする場合、2 つのスレッドを使用して同時に読み取り/書き込みを実行できることは明らかです。したがって、2 つのうち最速のスレッド (通常は読み取り) のパフォーマンス コストを節約できます。ただし、並行して読み取り/書き込みを行うために複数のスレッドは実際には必要ありません。非同期 IO だけです。

しかし、異なるディスクからの読み取り/書き込み時に async-IO が実際に高速化 (最大 2 倍) できるのであれば、なぜこれが CopyFile のデフォルトの実装ではないのでしょうか? (またはそれは?)

4

6 に答える 6

4

気をつけないと速度が遅くなってしまいます。ディスクはシリアル化されたアクセスに適しています。複数のスレッドがある場合、ディスク ヘッドはいたるところにあります。高パフォーマンスの SAN を扱っている場合、おそらくパフォーマンスが向上し、SAN はディスク アクセスの最適化に対処します。

于 2009-02-11T18:49:01.803 に答える
3

Vista SP1 でのファイル コピーのパフォーマンスの向上に関するブログ投稿を次に示します。

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

高性能のファイル コピーを実行するのは非常に困難であり、キャッシュの動作やネットワーク ドライバーの制限などを考慮する必要があります。

そのため、常に OS のファイル コピー機能 (Windows では FileCopyEx) を使用し、独自のファイルを作成しないでください。

于 2009-02-11T19:32:13.087 に答える
2

私はそうは思わないでしょう。CPUができることはほとんどありません。

于 2009-02-11T18:50:01.597 に答える
1

CopyFileを実装している場合は、複数のスレッド(たとえば、読み取り用の1つのスレッドと書き込み用の別のスレッド)を使用する代わりに、非同期I / Oを開始する単一のスレッドを使用できます(1つのスレッドが読み取りと書き込みを同時に開始/再開できるようにするため) 、完了ポートなどを使用します。

パフォーマンスを向上させるために、完全にカーネルに実装される場合があります。

于 2009-02-11T19:03:40.597 に答える
1

それは依存しますが、一般的にはいいえ、ボトルネックはディスク IO になり、複数のスレッドを使用してディスク IO を高速化することはできません。

非常にまれなケースでさえ、これは機能しますが、スレッド同期コードは非常に複雑になる必要があり、その価値はありません。

于 2009-02-11T18:51:48.130 に答える