日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?

發布時間:2023/12/10 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

還是那句話:十年河東,十年河西,莫欺少年窮。

今天和大家探討一個問題:Parallel.For 和 For 誰的效率高呢?

從CPU使用方面而言,Parallel.For 屬于多線程范疇,可以開辟多個線程使用CPU內核,也就是說可以并行處理程序。For 循環是單線程的,一個線程執行完所有循環。

因此你會認為:多線程的效率肯定高于單線程。但這樣認為是錯誤的!

例如下面程序:

static void Main(string[] args){Stopwatch sw = new Stopwatch();sw.Start();ParallelLoopResult result =Parallel.For(0, 10000, i =>{Console.Write("");});sw.Stop();TimeSpan ts2 = sw.Elapsed;Console.WriteLine("Parallel.For總共花費{0}ms.", ts2.TotalMilliseconds);// Stopwatch sw_Eq = new Stopwatch();sw_Eq.Start();for (int i = 0; i < 10000; i++){Console.Write(""); }sw_Eq.Stop();TimeSpan tssw_Eq = sw_Eq.Elapsed;Console.WriteLine("for總共花費{0}ms.", tssw_Eq.TotalMilliseconds);Console.ReadKey();}

?

額,為什么For 循環要比Parallel.For 效率要高呢?

這是因為循環體內執行的任務開銷太小,僅僅是輸出一個空字符串而已。微軟的文章已經指出任務的開銷大小對并行任務的影響。如果任務很小,那么由于并行管理的附加開銷(任務分配,調度,同步等成本),可能并行執行并不是優化方案。這也是上述程序For效率高出的原因。

如果在循環體內執行向數據庫插入操作,那么Parallel.For 效率就會高出,在此,我們認為每向數據庫插入一條記錄花費1毫秒時間,將程序修改如下:

class Program{static void Main(string[] args){Stopwatch sw = new Stopwatch();sw.Start();ParallelLoopResult result =Parallel.For(0, 10, i =>{Console.Write("");Thread.Sleep(1);});sw.Stop();TimeSpan ts2 = sw.Elapsed;Console.WriteLine("Parallel.For總共花費{0}ms.", ts2.TotalMilliseconds);// Stopwatch sw_Eq = new Stopwatch();sw_Eq.Start();for (int i = 0; i < 10; i++){Console.Write("");Thread.Sleep(1);}sw_Eq.Stop();TimeSpan tssw_Eq = sw_Eq.Elapsed;Console.WriteLine("for總共花費{0}ms.", tssw_Eq.TotalMilliseconds);Console.ReadKey();}} }

執行結果大大改變:

相信到此,大家應該明白了吧!也就說For是同步,Parallel.For 是異步執行。當然,我們也可以使用Thread實現異步編程:

代碼如下:

class Program{static void Main(string[] args){Console.WriteLine("主線程測試開始..");Thread th = new Thread(ThMethod);th.Start();Thread.Sleep(1000);Console.WriteLine("主線程測試結束..");Console.ReadLine();}static void ThMethod(){Console.WriteLine("異步執行開始");for (int i = 0; i < 5; i++){Console.WriteLine("異步執行" + i.ToString() + "..");Thread.Sleep(1000);}Console.WriteLine("異步執行完成");}}

Parallel.ForEach 和 ForEach ?與 Parallel.For 和 For 一樣,一個是異步執行,開辟多個線程。一個是同步執行,開辟一個線程。因此,效率方面同上,主要看執行的什么任務,在此不作具體說明。

下面寫了一些代碼,從下面的代碼中我們可以看出Parallel.ForEach具體開辟了幾個線程,如下:

class Program{static void Main(string[] args){int[] intList = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };ParallelLoopResult result = Parallel.ForEach(intList, (s,pls,longs) =>{Console.WriteLine(longs + " " + s);pls.Stop();if (pls.IsStopped){Parallel.Invoke(Gs,Ks);//異步調用多個方法 }});Console.ReadKey();}public static void Gs(){Console.WriteLine("異步方法1");}public static void Ks(){Console.WriteLine("異步方法2");}}

上述代碼中,調用了Stop()方法,我們都知道,如果是同步執行的,調用Stop()后,會立即停止執行,那么程序只會輸出索引值為0的結果。而在異步中不是這樣的,異步迭代是多線程且沒有順序的。其執行結果如下:

多次執行的結果可能不同。

如上圖所示,第一個圖開辟了三個線程,執行順序為 0 2 1,第二個圖開辟了兩個線程,執行順序為:1 0?

下面的Invoke()方法是異步調用其他的方法,在此不作解釋,可參考C# Invoke()

設置開啟的線程的個數:

Parallel.ForEach(NameArray,new ParallelOptions{MaxDegreeOfParallelism=3},(item,pls,i)=>{});

@陳臥龍的博客

總結

以上是生活随笔為你收集整理的C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。