C# 多線程使用Parallel.ForEach并行循環,真的能提高效能?
本文轉載自微信公眾號「后端Q」,作者conan。轉載本文請聯系后端Q公眾號。
概述
Parallel類是.NET 4中新增的抽象線程類。Parallel.For()方法類似于C#的for循環語句,也是多次執行一個任務。但是使用Parallel.For()方法,可以并行運行。微軟的并行運算平臺(Microsoft’s Parallel Computing Platform (PCP))提供了這樣一個工具,讓軟件開發人員可以有效的使用多核提供的性能。Parallel.ForEach()和Parallel.For()就是微軟并發類的成員。
測試
今天做了一個簡單的測試,同樣方法一般的for和foreach循環用時都在10秒鐘;并發for循環在0.5秒,并發foreach在0.1秒鐘。但是并發循環不能濫用,在簡單的少次數循環下,并發循環可能會體現不出其優勢。
結論
如果邏輯過于簡單的話,創建線程的花費將大于業務執行的花費,此時不建議使用Parallel。
示例
此示例循環去執行指定的任務,屬于比較耗時,所以使用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);
- });
- }
- });