5

以下の両方のソリューションで200個のファイルをコピーしようとしましたが、違いはわかりませんでした(以前System.Diagnostics.Stopwatchは時間を測定していました)。どちらの場合も8秒かかりました。2番目の(並列)ソリューションを高速化するべきではありませんか?Parallelを使用したIO操作なので、コピーが高速になると思いました。

私が欠けているものは何ですか?

// Case1 - Regular iteration
foreach (FileInfo file in files)
{
    string temppath = Path.Combine(destDirName, file.Name);
    file.CopyTo(temppath, false);
}

// Case2 - Parallel
Parallel.ForEach(files, file =>
{
    string temppath = Path.Combine(destDirName, file.Name);
    file.CopyTo(temppath, false);
});
4

2 に答える 2

7

タスクの並列実行は、パフォーマンスの向上を保証するものではありません。

あなたの場合、ファイルのコピーはCPUバウンドではなく、IOバウンドになる可能性があります。通常、CPU は IO デバイスよりもはるかに多くの帯域幅を使用できるため (Fusion IO カードなどを使用している場合を除く)、IO アクションによって CPU が長時間待機する傾向があります。

多くの CPU を使用するタスクを並列に実行して、パフォーマンスを向上させることができます。外部要因を待機するタスクも、ブロッキング タスクにならないように別のスレッドにシフトすることでメリットが得られます。

ただし、同じ外部リソースを待機しているタスクは、その外部リソース自体が複数のスレッドに関連付けられたトラフィックを処理できない限り、ほとんどメリットがない可能性があります (IO はトラフィックを処理できず、実際にリソースの競合を引き起こす可能性があります。遅くします)。

于 2012-10-24T09:06:07.237 に答える
1

上記の @Adam とまったく同じですが、ポイントが追加されています。

機会があれば、ネットワークに接続された 1 つまたは 2 つのドライブでこれを試してみてください。レイテンシーの高い接続でのファイル転送はセットアップのレイテンシーが大きいため、マルチスレッド ソリューションが有利になる可能性があります。

少数の固定数のスレッド (たとえば 2 つ) を持つプールを使用して、ディスクの競合が減少し、パフォーマンスが向上するかどうかを確認することも役立つ場合があります。

私の答えが気に入ったら、私ではなく@Adamに賛成票を投じてください。

于 2012-10-24T10:00:33.863 に答える