Foreach loop x Parallel.ForEach loop
- Foreach loop x Parallel.ForEach loop
C #Foreach loop
Foreach loop em C# é executado em um único thread e o processamento ocorre sequencialmente um por um. Foreach loop é uma característica básica de C# e está disponível a partir de C# 1.0. Sua execução é mais lenta do que o Paralelo.Foreach na maioria dos casos.
C# Parallel.ForEach loop
Parallel.ForEach loop em C# é executado em vários threads e o processamento ocorre de maneira paralela. Parallel.ForEach loop não é uma característica básica de C# e está disponível a partir de C# 4.0 e acima. Antes do C# 4.0 não podemos usá-lo. Sua execução é mais rápida do que foreach na maioria dos casos. Para usar o loop Parallel.ForEach precisamos importar System.Threading.Tarefas namespace ao usar a diretiva.
Mas você conhece bem o seu aplicativo e pode decidir qual deseja usar.
Estou dando 2 exemplos, no primeiro exemplo o loop foreach tradicional é mais rápido do que o loop foreach Parallel, onde, como no segundo exemplo, o loop foreach tradicional é muito lento em comparação com o Parallel.foreach.
Exemplo 1: Parallel.ForEach loop é mais lento do que o tradicional Foreach loop.
List<string> fruits = new List<string>();
fruits.Add("Apple");
fruits.Add("Banana");
fruits.Add("Bilberry");
fruits.Add("Blackberry");
fruits.Add("Blackcurrant");
fruits.Add("Blueberry");
fruits.Add("Cherry");
fruits.Add("Coconut");
fruits.Add("Cranberry");
fruits.Add("Date");
fruits.Add("Fig");
fruits.Add("Grape");
fruits.Add("Guava");
fruits.Add("Jack-fruit");
fruits.Add("Kiwi fruit");
fruits.Add("Lemon");
fruits.Add("Lime");
fruits.Add("Lychee");
fruits.Add("Mango");
fruits.Add("Melon");
fruits.Add("Olive");
fruits.Add("Orange");
fruits.Add("Papaya");
fruits.Add("Plum");
fruits.Add("Pineapple");
fruits.Add("Pomegranate");
Console.WriteLine("Printing list using foreach loop\n");var stopWatch = Stopwatch.StartNew();
foreach (string fruit in fruits)
{
Console.WriteLine("Fruit Name: {0}, Thread Id= {1}", fruit, Thread.CurrentThread.ManagedThreadId);
}
Console.WriteLine("foreach loop execution time = {0} seconds\n", stopWatch.Elapsed.TotalSeconds);
Console.WriteLine("Printing list using Parallel.ForEach");
stopWatch = Stopwatch.StartNew();
Parallel.ForEach(fruits, fruit =>
{
Console.WriteLine("Fruit Name: {0}, Thread Id= {1}", fruit, Thread.CurrentThread.ManagedThreadId);}
);
Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", stopWatch.Elapsed.TotalSeconds);
Console.Read();
C#
Copiar
Saída
Exemplo 2: Parallel.ForEach loop é mais rápido que o tradicional Foreach loop.
Perach Tradicional
var stopWatch = Stopwatch.StartNew();
PointF firstLocation = new PointF(10 f, 10 f);
PointF secondLocation = new PointF(10 f, 50 f);
foreach(string file in Directory.GetFiles(@ "D:\Images"))
{
Bitmap bitmap = (Bitmap) Image.FromFile(file);
using(Graphics graphics = Graphics.FromImage(bitmap))
{
using(Font arialFont = new Font("Arial", 10))
{
graphics.DrawString("Banketeshvar", arialFont, Brushes.Blue, firstLocation);
graphics.DrawString("Narayan", arialFont, Brushes.Red, secondLocation);
}
}
bitmap.Save(Path.GetDirectoryName(file) + "Foreachloop" + "\\" + Path.GetFileNameWithoutExtension(file) + Guid.NewGuid()
.ToString() + ".jpg");
}
Console.WriteLine("foreach loop execution time = {0} seconds\n", stopWatch.Elapsed.TotalSeconds);
C#
Copiar
Saída
Paralelo.foreach
var stopWatch = Stopwatch.StartNew();
PointF firstLocation = new PointF(10 f, 10 f);
PointF secondLocation = new PointF(10 f, 50 f);
Parallel.ForEach(Directory.GetFiles(@ "D:\Images"), file =>
{
Bitmap bitmap = (Bitmap) Image.FromFile(file);
using(Graphics graphics = Graphics.FromImage(bitmap))
{
using(Font arialFont = new Font("Arial", 10))
{
graphics.DrawString("Banketeshvar", arialFont, Brushes.Blue, firstLocation);
graphics.DrawString("Narayan", arialFont, Brushes.Red, secondLocation);
}
}
bitmap.Save(Path.GetDirectoryName(file) + "Parallel" + "\\" + Path.GetFileNameWithoutExtension(file) + Guid.NewGuid()
.ToString() + ".jpg");
});
Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", stopWatch.Elapsed.TotalSeconds);
Console.Read();
C#
Copiar
Saída
Para testar o desempenho do código acima, usei cerca de 150 imagens em ambos os casos.
Você pode ver que se você estiver fazendo qualquer tarefa em massa dentro do loop foreach, em seguida, parallel.foreach é muito rápido, então você pode ir para parallel.foreach. Mas se você apenas iterando e fazendo uma pequena tarefa dentro do loop, então vá para o tradicional para loop.