C# 多線程使用Parallel.ForEach并行循環(huán),真的能提高效能?
本文轉(zhuǎn)載自微信公眾號「后端Q」,作者conan。轉(zhuǎn)載本文請聯(lián)系后端Q公眾號。
概述
Parallel類是.NET 4中新增的抽象線程類。Parallel.For()方法類似于C#的for循環(huán)語句,也是多次執(zhí)行一個任務(wù)。但是使用Parallel.For()方法,可以并行運行。微軟的并行運算平臺(Microsoft’s Parallel Computing Platform (PCP))提供了這樣一個工具,讓軟件開發(fā)人員可以有效的使用多核提供的性能。Parallel.ForEach()和Parallel.For()就是微軟并發(fā)類的成員。
測試
今天做了一個簡單的測試,同樣方法一般的for和foreach循環(huán)用時都在10秒鐘;并發(fā)for循環(huán)在0.5秒,并發(fā)foreach在0.1秒鐘。但是并發(fā)循環(huán)不能濫用,在簡單的少次數(shù)循環(huán)下,并發(fā)循環(huán)可能會體現(xiàn)不出其優(yōu)勢。
結(jié)論
如果邏輯過于簡單的話,創(chuàng)建線程的花費將大于業(yè)務(wù)執(zhí)行的花費,此時不建議使用Parallel。
示例
此示例循環(huán)去執(zhí)行指定的任務(wù),屬于比較耗時,所以使用Parallel,提高效率。
- var objctLock = new object();
- Parallel.ForEach(columnsList, () => new List<TencentSportDateMatches>(), (x, l, r) =>
- {
- GetMatchListByColumns(startDate, endDate, x.ColumnsId, x.Name, r);
- return r;
- }, x =>
- {
- lock (objctLock)
- {
- x.ForEach(z =>
- {
- var info = result.FirstOrDefault(k => k.Date == z.Date);
- if (info == null)
- {
- info = new TencentSportDateMatches
- {
- Date = z.Date,
- Matches = new List<TencentSportMatchInfo>()
- };
- result.Add(info);
- }
- info.Matches.AddRange(z.Matches);
- });
- }
- });