对比C# Parallel.ForEach()与foreach()速度快慢
作者:admin 时间:2023-6-5 14:46:30 浏览:foreach 循环
C# 中的foreach
循环在单个线程上运行,并且处理一个接一个地按顺序进行。foreach
循环是 C# 的一项基本功能,从 C# 1.0 开始提供。在大多数情况下,它的执行速度比 Parallel.Foreach
慢。
Parallel.ForEach 循环
C# 中的 Parallel.ForEach
循环在多个线程上运行,处理以并行方式进行。Parallel.ForEach
循环不是 C# 的基本功能,它在 C# 4.0 及更高版本中可用。在 C# 4.0 之前我们不能使用它。在大多数情况下,它的执行速度比 foreach
快。要使用 Parallel.ForEach
循环,我们需要在 using
指令中导入System.Threading.Tasks
命名空间。
但是你非常了解你的应用程序,并且可以决定要使用哪一个。
我给出了 2 个示例,在第一个示例中,传统的 foreach
循环比 Parallel.ForEach
循环更快,而在第二个示例中,传统的 foreach
循环与 Parallel.ForEach
相比非常慢。
示例 1: Parallel.ForEach 循环比传统的 foreach 循环慢。
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();
输出
示例 2:Parallel.ForEach 循环比传统的 foreach 循环更快。
传统的foreach
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);
输出
Parallel.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();
输出
结论
为了测试上述代码的性能,我在这两种情况下都使用了大约 150 张图像。
你可以看到,如果你在 foreach
循环内执行任何批量任务,那么 Parallel.ForEach
非常快,因此你可以使用 Parallel.ForEach
。
Parallel.ForEach
循环的工作方式类似于Parallel.For循
环。循环对源集合进行分区,并根据系统环境在多个线程上安排工作。系统上的处理器越多,并行方法运行得越快。对于某些源集合,顺序循环可能更快,具体取决于源的大小和循环执行的工作类型。
如果你只是在循环内迭代并执行非常小的任务,那么请使用传统的for
循环。
相关文章
- 站长推荐