• C# Parallel.ForEach与foreach的使用


      我们循环大多数是用的foreach,这种方法是串行,也就是单线程,而Parallel.ForEach指的是并行,也就是多线程。

      在循环迭代时,并不是用并行时间越短,下面是一个测试实例,分别用串行和并行循环150W条数据

    using System;
    using System.Collections;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ConsoleApp2
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConcurrentBag<Stu> conStu = new ConcurrentBag<Stu>();
                ConcurrentBag<Stu> conStu2 = new ConcurrentBag<Stu>();
                
                int num = 1500000;//150万
    
                //获取集合
                var lst = GetStu(num);
    
    
                #region 串行循环
                    var watch = new Stopwatch();
                    watch.Start();
                    foreach (var item in lst)
                    {
                        conStu.Add(item);
                    }
    
                    watch.Stop();
                    var completeRequest = watch.ElapsedMilliseconds;
                    Console.WriteLine($"
    
    Foreach {num.ToString("N0")} 使用时间(毫秒):{completeRequest}");
                    Console.WriteLine($"conStu 集合中共:{conStu.Count + 1}条");
                #endregion
    
                #region 并行循环
                    var watch2 = new Stopwatch();
                    watch2.Start();
                    ParallelLoopResult result = Parallel.ForEach(lst, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, item =>
                    {
                        conStu2.Add(item);
                    });
    
                    watch2.Stop();
                    var completeRequest2 = watch2.ElapsedMilliseconds;
                    Console.WriteLine($"
    
     Parallel.ForEach  {num.ToString("N0")} 使用时间(毫秒):{completeRequest2}");
                    Console.WriteLine($"conStu2 集合中共:{conStu2.Count + 1}条");
                #endregion
    
            }
    
            public  static List<Stu> GetStu(int num)
            {
                List<Stu> lstStu = new List<Stu>();
                for (int i = 1; i < num; i++)
                {
                    Stu sModle = new Stu();
                    sModle.Id = i;
                    sModle.uName = "测试" + i;
                    lstStu.Add(sModle);
                }
                return lstStu;
            }
           
        }
    
    
    
        public class Stu
        {
            public int Id { get; set; }
    
            public String uName { get; set; }
        }
    }

      测试了3次,但结果还是用串行时间会少些

  • 相关阅读:
    Linux设备驱动阻塞与非阻塞I/O
    Linux设备驱动轮询操作
    Linux设备驱动中的并发控制
    Python趣味入门8:集合变量列表、集合、元组、字典
    买我的《Python青少年趣味编程》给寒假爱编程的小朋友一点温暖。
    第56篇ProfileData与DataLayout
    第59篇编译策略
    第60篇获取编译任务
    第63篇解释器与编译器适配(二)
    第57篇profile实例
  • 原文地址:https://www.cnblogs.com/personblog/p/13246599.html
Copyright © 2020-2023  润新知