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