Boucle Foreach :
- Les itérations se déroulent séquentiellement, une par une.
- La boucle foreach est exécutée à partir d'un seul Thread.
- La boucle foreach est définie dans tous les frameworks de .NET.
- L'exécution est plus lente
Parallèle.ForEach :
- L'exécution se fait de manière parallèle.
- Parallel.ForEach utilise plusieurs Threads.
- Parallel.ForEach est défini dans les frameworks .Net 4.0 et plus.
- L'exécution est plus rapide3
L'exemple suivant démontre clairement la différence entre la boucle foreach traditionnelle et la boucle
Exemple de Parallel.ForEach() .
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ParallelForEachExample
{
class Program
{
static void Main()
{
string[] colors = {
"1. Red",
"2. Green",
"3. Blue",
"4. Yellow",
"5. White",
"6. Black",
"7. Violet",
"8. Brown",
"9. Orange",
"10. Pink"
};
Console.WriteLine("Traditional foreach loop\n");
//start the stopwatch for "for" loop
var sw = Stopwatch.StartNew();
foreach (string color in colors)
{
Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
Console.WriteLine("foreach loop execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
Console.WriteLine("Using Parallel.ForEach");
//start the stopwatch for "Parallel.ForEach"
sw = Stopwatch.StartNew();
Parallel.ForEach(colors, color =>
{
Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
);
Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", sw.Elapsed.TotalSeconds);
Console.Read();
}
}
}
Sortie
Traditional foreach loop
1. Red, Thread Id= 10
2. Green, Thread Id= 10
3. Blue, Thread Id= 10
4. Yellow, Thread Id= 10
5. White, Thread Id= 10
6. Black, Thread Id= 10
7. Violet, Thread Id= 10
8. Brown, Thread Id= 10
9. Orange, Thread Id= 10
10. Pink, Thread Id= 10
foreach loop execution time = 0.1054376 seconds
Utilisation de l'exemple Parallel.ForEach
1. Red, Thread Id= 10
3. Blue, Thread Id= 11
4. Yellow, Thread Id= 11
2. Green, Thread Id= 10
5. White, Thread Id= 12
7. Violet, Thread Id= 14
9. Orange, Thread Id= 13
6. Black, Thread Id= 11
8. Brown, Thread Id= 10
10. Pink, Thread Id= 12
Parallel.ForEach() execution time = 0.055976 seconds
Merci....
0 votes
On a peut-être répondu à cette question ici stackoverflow.com/questions/3789998/
2 votes
@UjjwalManandhar C'est en fait assez différent, puisque la question porte sur la différence entre le
Parallel
et en utilisant PLINQ.20 votes
D'autres ont répondu comment vous pouvez réécrire. Alors, que fait-il ? Il effectue une "action" sur chaque élément de la collection, tout comme une action normale
foreach
. La différence est que la version parallèle peut effectuer plusieurs "actions" en même temps. Dans la plupart des cas (en fonction de l'ordinateur qui exécute le code, de son niveau d'activité et d'autres facteurs), elle sera plus rapide, et c'est l'avantage le plus important. Notez que lorsque vous le faites en parallèle, vous ne pouvez pas savoir dans quelle commander les articles sont traités. Avec un habituel (série)foreach
vous avez la garantie quelines[0]
vient en premier, puislines[1]
et ainsi de suite.1 votes
@JeppeStigNielsen Il le fera. no ne sera pas toujours plus rapide, car il y a des frais généraux importants pour rendre les choses parallèles. Cela dépend de la taille de la collection sur laquelle vous itérez et de l'action qu'elle contient. La bonne chose à faire est de mesure la différence entre l'utilisation de Parallel.ForEach() et l'utilisation de foreach(). Souvent, un foreach() normal est plus rapide.
3 votes
@DaveBlack Bien sûr. On devra mesure si elle est plus rapide ou plus lente, dans chaque cas. J'essayais juste de décrire la parallélisation en général.