技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

对比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 循环。

相关文章

标签: Parallel.ForEach  CSharp  foreach  for  
x
  • 站长推荐
/* 左侧显示文章内容目录 */