Ich habe Beispielcode zum Vergleich der Verarbeitungszeit für Parallel-Ansatz und Aufgabe Ansatz. Das Ziel dieses Experiments ist das Verständnis, wie sie funktionieren.Task.WaitAll-Methode vs Parallel.Invoke-Methode
Also meine Fragen sind:
- Warum dann Task Parallel arbeitete schneller?
- Bedeutet mein Ergebnis, dass ich Parallel statt Task verwenden soll?
- Wo soll ich Task und wo Parallel?
- Welche Vorteile der Verwendung von Task im Vergleich zu Parallel?
Ist Aufgabe nur ein Umbruch für die ThreadPool.QueueUserWorkItem-Methode?
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(); }
Hier sind meine Verarbeitungsergebnisse:
EDIT:
Geänderte Code wie folgt aussehen:
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();
Meine neue Ergebnisse:
EDIT 2: Wenn ich Code mit Parallel.Invoke ersetzt ersten und Task.WaitAll sein zu Sekunde die Situation kardinal geändert wurde. Jetzt ist Parallel langsamer. Es lässt mich an die Unrichtigkeit meiner Schätzungen denken. Ich änderte Code wie folgt aussehen:
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();
}
Und hier meine neuen Ergebnisse sind:
Jetzt kann ich vorschlagen, dass dieses Experiment sehr viel klarer ist. Die Ergebnisse sind fast gleich. Manchmal ist Parallel und manchmal Task schneller. Jetzt sind meine Fragen:
1. Wo soll ich Aufgabe verwenden und wo Parallel?
2. Welche Vorteile der Verwendung von Task im Vergleich zu Parallel?
3. Ist Aufgabe nur ein Umbruch für die ThreadPool.QueueUserWorkItem-Methode?
Alle hilfreiche Informationen, die diese Fragen klären können, sind willkommen.
tasks.Add (Task.Factory.StartNew (() => p.SomeLongOperation())); schon gestartet, aber zu diesem Zeitpunkt hat deine Stoppuhr noch nicht angefangen zu zählen! – David
Wie sollte ich den Code ändern, um dieses Experiment zu verdeutlichen? –
Verschieben Sie es über die startnew() – David