Paralleles programmieren langsamer als Sequentielles

port29

deus.Server
Hallo Leute,

ich wollte mal etwas mit der .Net Parallelen Bibliothek herumspielen, doch leider hielt sich mein Erfolg leider in Grenzen. Ich habe jetzt einfach ein mini Programm erstellt, das nichts anderes macht, als hochzuzählen und damit CPU Zeit zu verbrauchen.

Code:
            DateTime beginTopDownTime = new DateTime(0);
            DateTime endTopDownTime = new DateTime(0);

            Int64 bla = 1;

            beginTopDownTime = DateTime.Now;
            for (Int64 i = 1; i < 2000000000; i++)
            {
                bla += i;
            }
            endTopDownTime = DateTime.Now;
            TimeSpan topDownTime = (TimeSpan)(endTopDownTime - beginTopDownTime);
            MessageBox.Show("bla" + bla + " " + topDownTime);

            bla = 1;
            beginTopDownTime = DateTime.Now;
            Parallel.For(0, 2000000000, i => {
                bla += i;
            });
            endTopDownTime = DateTime.Now;
            topDownTime = (TimeSpan)(endTopDownTime - beginTopDownTime);

            MessageBox.Show("bla" + bla + " " + topDownTime);

Nun, bei dem sequentiell laufendem Code bekomme ich bei einer 2-CPU Maschine eine Laufzeit von 10 Sekunden, bei dem Parallel.For Teil sind es rund 25 Sekunden. Ich erkläre es mir eigentlich durch einen höheren Overhead, der zum erstellen und verwalten der Threads notwendig ist.

Jetzt stellen sich mir zwei Fragen:

1) Lohnt sich das paralleles Programmieren nicht, wenn ich eine geringe Last in den Threads habe?
2) Wieso hat der Compiler den Schrott, den ich geschrieben habe, nicht einfach weggeputzt? In der Regel ersetzt er doch so ein Quatsch durch feste Werte.
 
Jetzt stellen sich mir zwei Fragen:

1) Lohnt sich das paralleles Programmieren nicht, wenn ich eine geringe Last in den Threads habe?
Ja. Der Overhead entsteht hier vor allem auch durch die Funktionsaufrufe. (\edit: siehe http://msdn.microsoft.com/en-us/library/dd560853.aspx)
2) Wieso hat der Compiler den Schrott, den ich geschrieben habe, nicht einfach weggeputzt? In der Regel ersetzt er doch so ein Quatsch durch feste Werte.
Nur bei simplen Aufgaben (z.B. wenn du bla = i setzt, dann kann der Compiler optimieren und gleich bla auf 2000000000 setzen und die Schleife entfernen). Sonst würde jedesmal Kompilieren 10 Sekunden dauern... :suspekt:

Benutze doch einfach zur Zeitmessung eine Stopwatch.

Und hast du mal die Ergebnisse verglichen ob auch das Gleiche herauskommt? Du greifst ja da von mehreren Threads auf eine Variable zu...

Gruß
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück