C# keine beschleunigung durch parallelisierung (PLINQ)

Berba

Lt. Junior Grade
Registriert
Okt. 2007
Beiträge
290
Sehr Community,
wie so oft stehe ich am Rande meiner Programmierkenntnisse und erhoffe mir Tipps von euch.

Kern des Problems ist ein C#-programm, was 2 dateien einliest um mit diesen eine möglichst große 2-dimensionale matrix zu erzeugen. mithilfe von LINQ soll diese matrix abgefragt werden.

ich befasse mich mit linq und plinq...die mögliche parallelisierung des programmes geschieht durch anhängen von "Asparallel()" an die zeile " var query = from Person person in Personenliste.AsParallel()"...lasse ich das AsParallel()" weg, so ist das Programm aber irgendwie schneller mit der abfrage fertig..

ich verstehe das nicht und hätte gern ein erklärung hierfür...evtl sind ja auch einfach meine stopuhren falsch eingesetzt??!?!


Code:
ArrayList namenliste = new ArrayList();
            ArrayList Alterliste = new ArrayList();
            ArrayList Stadtliste = new ArrayList();
            ArrayList Personenliste = new ArrayList();
            Stopwatch stopwatch = new Stopwatch();
            Stopwatch stopwatchdateienlesen = new Stopwatch();
            Stopwatch stopwatchpersonen = new Stopwatch();

            StreamReader frauennamen = new StreamReader(@"c:\Frauennamen.txt");
            string eingelesenezeile = "";
            int i = 0;
            stopwatchdateienlesen.Start();

            while (eingelesenezeile != null)
            {
                eingelesenezeile = Convert.ToString(frauennamen.ReadLine());
                namenliste.Add(eingelesenezeile); i++;
            }
            namenliste.RemoveAt(i - 1);

            eingelesenezeile = "";
            

            StreamReader Städte = new StreamReader(@"c:\Städte.txt");
            int k = 0;

            while (eingelesenezeile != null)
            {
                eingelesenezeile = Convert.ToString(Städte.ReadLine());
                Stadtliste.Add(eingelesenezeile); k++;
            }
            Stadtliste.RemoveAt(k - 1);

            stopwatchdateienlesen.Stop();

            stopwatchpersonen.Start();
            
            for (int a = 0; a < i-1; a++)
            {
                for (int b = 0; b < k - 1; b++)
                {
                    Personenliste.Add(new Person { Name = Convert.ToString(namenliste[a]), Städtchen = Convert.ToString(Stadtliste[b]), Geschlecht = false });

                    stopwatchpersonen.Stop();
                }}

                stopwatch.Start();
                var query = from Person person in Personenliste.AsParallel()
                            where person.Städtchen.Contains("c") & person.Name.Length > 6 & person.Städtchen.Contains("a")
                            orderby person.Name.Length
                            select person;
                stopwatch.Stop();
            
                   
                
                    label2.Text = Convert.ToString(stopwatch.ElapsedTicks);
                    label7.Text = Convert.ToString(stopwatchdateienlesen.ElapsedTicks);
                    label6.Text = Convert.ToString(stopwatchpersonen.ElapsedTicks);
                
            
        }

    }
}




mfg jerome gehrmann
 
Um wie viel Zeit reden wir hier? D. h. wie groß ist der Preformance-Unterschied?
Wie viel Daten verwendest du? D. h. wie viele Einträge haben die eingelesenen Dateien?

Generell:
Parallelisierung kostet zunächst mal Geschwindigkeit, die Arbeit erst aufgeteilt und dann das Ergebnis wieder zusammengefügt werden muss. Bei wenigen Daten kann sich die Performance durchaus verschlechtern.
Man sollte Parallelisierung nur sehr begrenzt einsetzen, also nur dort wo sie auch sinnvoll ist.

PS: Statt "ArrayList" bitte die typsichere Klasse "List<T>" verwenden.
 
wir reden hier von 10,1 millionen datensätzen

die abfrage mit parallelisierung benötigt ca. 46000-50000 ticks, ohne parallelisierung benötigt ca. 28000 ticks

ein datensatz beinhaltet name, stadt,geschlecht

ich habe 4 kerne zum berechnen :D
Ergänzung ()

ps. die listen sbeinhalten 2000namen bzw. 5000 städte....daraus ergibt sich die matrix =)...falls das wichtig ist, dass der gleiche name andauernd auftaucht


weitere ergänzung: mir ist auch nicht bewusst wie linq das parallelisiert. werden bei vier kernen einfach mehrere datensätze gleichzeitig auf die argumente geprüft oder übernimmt jeder kern das prüfen eines argumentes bei einem datensatz?!?!
 
Zuletzt bearbeitet:
vielen dank cx01..genau das habe ich eben auch gefunden und du hast recht :D
jetzt funktioniert es =)

vielen dank..auch wenn sich mir die logik dahinte rnicht ergibt ;)
 
Zurück
Oben