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($"\n\nForeach {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($"\n\n 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次,但結果還是用串行時間會少些

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM