2012-05-02 10 views
5

Ich habe ein wenig über Parallelität in den letzten Tagen gelernt, und ich bin auf this Beispiel gestoßen.Warum war die parallele Version in diesem Beispiel langsamer als die sequenzielle Version?

Ich habe es Seite mit einem sequentiellen for-Schleife wie folgt Seite:

private static void NoParallelTest() 
{ 
    int[] nums = Enumerable.Range(0, 1000000).ToArray(); 
    long total = 0; 
    var watch = Stopwatch.StartNew(); 
    for (int i = 0; i < nums.Length; i++) 
    { 
     total += nums[i]; 
    } 
    Console.WriteLine("NoParallel"); 
    Console.WriteLine(watch.ElapsedMilliseconds); 
    Console.WriteLine("The total is {0}", total); 
} 

Ich war überrascht zu sehen, dass die NOPARALLEL Verfahren abgeschlossen Weise viel schneller als das parallel Beispiel an der Stelle gegeben.

Ich habe einen i5 PC.

Ich dachte wirklich, dass die Parallel-Methode schneller beenden würde.

Gibt es eine vernünftige Erklärung dafür? Vielleicht habe ich etwas falsch verstanden?

+1

Können Sie bestätigen, dass die parallele Version lief tatsächlich auf mehreren Kernen? Und was passiert, wenn Sie die Anzahl der Iterationen erhöhen (größere 'Range')? – chrisaycock

+6

Unter der Annahme, dass die parallele Version auf mehreren Kernen ausgeführt wurde, kann es Ihnen einfach zeigen, wie viel Overhead-Thread-Synchronisierung haben kann ... besonders in einem trivialen Stück Code. – Oded

+0

Um Mark Twain zu paraphrasieren; * "Es gibt Lügen, verdammte Lügen, Statistiken und Benchmarks ..." * –

Antwort

10

Die sequentielle Version schneller war, weil die Zeit bei jeder Iteration in Ihrem Beispiel zu tun Operationen ausgegeben ist sehr klein und es ist ein ziemlich erheblicher Aufwand beteiligt bei der Erstellung und Verwaltung von mehreren Threads.

Parallel-Programmierung erhöht nur die Effizienz, wenn jeder Iteration ausreichend teuer im Hinblick auf die Prozessorzeit ist.

2

Ich denke, das liegt daran, dass die Schleife eine sehr einfache, sehr schnelle Operation ausführt.

Im Fall der nicht-parallelen Version, die ist alles, es tut. Aber die parallele Version muss einen Delegaten aufrufen. Das Aufrufen eines Delegierten ist ziemlich schnell und normalerweise müssen Sie sich nicht sorgen, wie oft Sie das tun. Aber in diesem extremen Fall ist es der Unterschied. Ich kann mir leicht vorstellen, dass das Aufrufen eines Delegaten, sagen wir, zehnmal langsamer ist (oder mehr, ich habe keine Ahnung, wie das genaue Verhältnis ist), als eine Zahl aus einem Array hinzuzufügen.

2

Sie sind nicht Äpfel mit Birnen vergleichen.

Das Beispiel Sie verknüpfen ist nicht über Parallelität oder Gleichzeitigkeit so viel wie es über Zustand zu trennen ist von amoung die verschiedenen Threads gemeinsam genutzt werden. Die Arbeit es ist ein Strohmann, nur um zu zeigen, dass etwas getan wird.

Also, was Sie vergleichen ist ein F1-Auto zu einem Top Fuel Dragster wie zu vergleichen. Jede Excel geht schnell, aber schnell ist relativ zum Kontext, die in diesem und den meisten Fällen hoch spezialisiert ist. Beide können in den anderen hochspezialisierten Vogteien nicht mithalten.

Lektionen lernen

  • gleichzeitig! = Schneller
  • schlecht täuschen Benchmarks konzipiert
Verwandte Themen