Parallel アプローチと Task アプローチの処理時間を比較するサンプル コードがあります。この実験の目的は、それらがどのように機能するかを理解することです。
だから私の質問は:
- Parallel が Task よりも高速に動作したのはなぜですか?
- この結果は、Task の代わりに Parallel を使用する必要があるということですか?
- どこでタスクを使用し、どこでパラレルを使用する必要がありますか?
- Parallel と比較して Task を使用する利点は何ですか?
Task は ThreadPool.QueueUserWorkItem メソッドの単なるラップですか?
public Task SomeLongOperation() { return Task.Delay(3000); } static void Main(string[] args) { Program p = new Program(); List<Task> tasks = new List<Task>(); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); tasks.Add(Task.Factory.StartNew(() => p.SomeLongOperation())); var arr = tasks.ToArray(); Stopwatch sw = Stopwatch.StartNew(); Task.WaitAll(arr); Console.WriteLine("Task wait all results: " + sw.Elapsed); sw.Stop(); sw = Stopwatch.StartNew(); Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation()); Console.WriteLine("Parallel invoke results: " + sw.Elapsed); sw.Stop(); Console.ReadKey(); }
ここに私の処理結果があります:
編集:
コードを次のように変更しました。
Program p = new Program();
Task[] tasks = new Task[2];
Stopwatch sw = Stopwatch.StartNew();
tasks[0] = Task.Factory.StartNew(() => p.SomeLongOperation());
tasks[1] = Task.Factory.StartNew(() => p.SomeLongOperation());
Task.WaitAll(tasks);
Console.WriteLine("Task wait all results: " + sw.Elapsed);
sw.Stop();
sw = Stopwatch.StartNew();
Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation());
Console.WriteLine("Parallel invoke results: " + sw.Elapsed);
sw.Stop();
私の新しい結果:
編集 2: コードを Parallel.Invoke を最初に、Task.WaitAll を 2 番目に置き換えると、状況が大きく変わりました。Parallel が遅くなりました。自分の見積もりの誤りを考えさせられます。コードを次のように変更しました。
Program p = new Program();
Task[] tasks = new Task[2];
Stopwatch sw = null;
for (int i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
Parallel.Invoke(() => p.SomeLongOperation(), () => p.SomeLongOperation());
string res = sw.Elapsed.ToString();
Console.WriteLine("Parallel invoke results: " + res);
sw.Stop();
}
for (int i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
tasks[0] = Task.Factory.StartNew(() => p.SomeLongOperation());
tasks[1] = Task.Factory.StartNew(() => p.SomeLongOperation());
Task.WaitAll(tasks);
string res2 = sw.Elapsed.ToString();
Console.WriteLine("Task wait all results: " + res2);
sw.Stop();
}
そして、ここに私の新しい結果があります:
これで、この実験はより明確になったと言えます。結果はほぼ同じです。Parallel の場合もあれば、Task の方が速い場合もあります。今私の質問は次のとおりです。
1. Task はどこで、Parallel はどこで使用する必要がありますか?
2. Parallel と比較して Task を使用する利点は何ですか?
3. Task は ThreadPool.QueueUserWorkItem メソッドの単なるラップですか?
これらの質問を明確にすることができる有用な情報は大歓迎です。