ディレクトリのコピーを行う処理に対し、逐次処理の場合と並列処理形の場合での処理時間の比較を行ってみた。
動作確認環境
- Windows10 x64
- コア数:4
- 論理プロセッサ:8
- RAM:8GB
- コピー元/コピー先:SSDの同じドライブ内のフォルダー間でコピーを実施
- VisualStudio2022
- コンソールアプリ(.NETFramework4.8)
- C#7.3
少なくとも今回のケースでは並列処理の方が速くなったので処理時間を短縮したい場合は並列処理を試してみるのも良いのではないかと思う。しかしこの記事では並列処理で必ずしも高速化できるとは言えない結果になったので、機能ごとに実装すべきか検討の必要がありそう。
検証方法
サイズ:320MB(ディスク上のサイズ:392MB)
↑のディレクトリを1単位とし、このディレクトリを1個、2個、4個、8個、16個、32個コピーするケースで逐次処理を用いた場合と並列処理を用いた場合で処理時間がどの程度変わるか確認した。
ソースコード(イメージ)
逐次処理に用いたソースコード(イメージ)
//ディレクトリにあるファイルやサブディレクトリをコピーする
for (int i1 = 0; i1 < 【コピー元のパス/コピー先のパス等の情報を格納したList】.Count; i1++)
{
【ディレクトリを1つコピーするメソッドを実行する。引数にコピー元やコピー先を指定】
}
並列処理に用いたソースコード(イメージ)
//Taskをまとめて管理するList
List<Task<int>> tasks = new List<Task<int>>();
for (int i1 = 0; i1 < 【コピー元のパス/コピー先のパス等の情報を格納したList】.Count; i1++)
{
Task<int> t = Task.Factory.StartNew(【ディレクトリを1つコピーするメソッド】, 【コピー元やコピー先】);
tasks.Add(t);
}
//全てのTaskの完了を待つ
Task.WaitAll(tasks.ToArray());
確認結果
以下が結果。並列処理の方が処理時間が短縮できていることがうかがえる。
メモ
並列処理を行った場合はCPUの使用率が逐次処理と比べ上がっていたので、もしユーザーが他のアプリケーションも使いながらコピー処理を回す場合は、逐次処理を用いた方が動作が軽くなると思うので逐次処理の方がいい場合もあると思う。
一方で夜間バッチなどユーザーがPCから離れている時間帯にコピー処理を行うのであれば、並列処理を実装して効果的になるケースが考えられる。
今回の確認結果では、並列処理の方が処理時間を短縮できる傾向が見られたが、この記事の確認では必ずしも並列処理にすれば処理速度を向上できるという結果にはならなかったので、一概に並列処理化すればいいというものではないと思う。機能ごとに並列化すべきか検討する必要がありそう。