Entwickler-Ecke

Basistechnologien - Verständnisproblemchen Parallelisierung und Lamdba-Ausdrücke


OlafSt - Mo 17.06.13 14:00
Titel: Verständnisproblemchen Parallelisierung und Lamdba-Ausdrücke
Hallo Freunde,

ich beiße mich gerade durch den Guide "Parallel Programming with .NET" in der MSDN durch. So weit klingt das ja ganz simpel, bis auf eine Geschichte.

Gleich zu Beginn geht es um parallele Schleifen. Ein simples Beispiel wäre:


C#-Quelltext
1:
2:
3:
4:
for (int i=0; i < n; i++)
{
  BlockVar[i]++;
}


Um das zu parallelisieren, soll ich aus dem Schleifenkörper einen Lamda-Ausdruck machen. Etwa so:

C#-Quelltext
1:
2:
3:
4:
Parallel.for(0,n,i =>
{
   //Do something useful here
}


Sähe dann mein Code so aus:

C#-Quelltext
1:
2:
3:
4:
Parallel.for(0, n, i =>
{
  BlockVar[i]++;
}


?

Ich gestehe, das ganze Zeug mit Lamdba-Ausdrücken habe ich nie verstanden, wohl aus Ermangelung eines wirklich brauchbaren Tutorials...


Th69 - Mo 17.06.13 14:36

Hallo,

dein Code ist fast richtig:

C#-Quelltext
1:
2:
3:
4:
Parallel.For(0, n, i =>
{
  BlockVar[i]++;
});

For ist dabei eine statische Methode der Parallel-Klasse.

Und zum Thema Lambda-Ausdruck verweise ich dich mal auf meinen Beitrag in Delegaten und Lambda-Ausdrücke [http://www.entwickler-ecke.de/viewtopic.php?p=658229#658229].


OlafSt - Mo 17.06.13 15:50

Nachdem ich das alles mal studiert habe:

Lambda-Ausdrücke sind also im wesentlichen nur eine Möglichkeit, anonyme Methoden in Kurzform darzustellen ?
Und anonyme Methoden wiederum sind im wesentlichen eine Möglichkeit, seine "Utils.cs" (also die Quelltextdatei mit all den kleinen, nirgendwohin passenden Hilfsroutinen) kurz zu halten - sprich, sich Tipparbeit zu sparen ?

Ich erkenne das gewaltige Potential, sein Programm sehr kompakt zu formulieren - und es gleichzeitig ungeheuer unlesbar zu gestalten :D

Demontieren wir unser Parallels.For-Beispiel - nur zum Verständnis :wink:

C#-Quelltext
1:
2:
3:
4:
Parallel.For(0, n, i =>
{
  BlockVar[i]++;
});


Den Lambda formulieren wir aus, in Form einer anonymen Methode:

C#-Quelltext
1:
Parallel.For(0,n, delegate (int i) {BlockVar[i]++;});                    


Die anonyme Methode formulieren wir nun auch komplett aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
delegate void Operation(int i);

void AddOne(int Index)
{
   BlockVar[Index]++;
}

Operation op=this.AddOne;
Parallel.For(0,n,op);


Habe ich das so in etwa richtig begriffen ?


Th69 - Mo 17.06.13 16:39

Ja, exakt :zustimm:


OlafSt - Do 20.06.13 13:50

Sorry fürs späte antworten, aber 40 Fieber hauen mich nun mal immer um - besonders, wenn draußen als Bonus noch 32 Grad herrschen ;)

Summa summarum: Dann habe ich das Zeug jetzt verstanden. Gutes Tutorial !