淺談Visual Studio 2010并行運(yùn)算原理
在這里我們將介紹Visual Studio 2010并行運(yùn)算的原理,希望通過本文能對(duì)大家了解Visual Studio 2010并行運(yùn)算。這也是大家比價(jià)關(guān)心的熱點(diǎn)。
Visual Studio 2010 Beta2&.Net 4.0的Beta2相比Beta1在性能上有了很大的改進(jìn),已經(jīng)基本可以使用了。.NET 4.0給我們帶來許多新特性,如動(dòng)態(tài)類型、云平臺(tái)、并行運(yùn)算等。本文討論一下.NET 4.0的并行運(yùn)算。
其實(shí)并行運(yùn)算并不是在.Net 4.0才有的。大家都知道,通過增加CPU的主頻可以提高CPU的性能,但由于設(shè)計(jì)的限制,主頻是不可能無限制的提高。這個(gè)時(shí)候,把提高性能的方式轉(zhuǎn)向使用多個(gè)心(多核),現(xiàn)在的電腦幾乎都是多核的。但在軟件中并還沒有跟上這個(gè)節(jié)奏,大多數(shù)軟件還是采用傳統(tǒng)的方式,并沒有很好的發(fā)揮多核的優(yōu)勢(shì)。
微軟的并行運(yùn)算平臺(tái)(Microsoft’s Parallel Computing Platform (PCP))提供了這樣一個(gè)工具,讓軟件開發(fā)人員可以有效的使用多核提供的性能。本文就進(jìn)行一個(gè)簡(jiǎn)單的測(cè)試,來體驗(yàn)Visual Studio 2010并行運(yùn)算的性能。
1. 新建一個(gè)List,并在開始時(shí)初始化
- public static IList<int> Datas = new List<int>();
- static void Main(string[] args)
- {
- InitializeData();
- Console.Read();
- }
- /// <summary>
- /// 初始化數(shù)據(jù)
- /// </summary>
- private static void InitializeData()
- {
- Datas.Clear();
- for (int i = 0; i < 20; i++)
- {
- Datas.Add(i);
- }
- }
2.設(shè)計(jì)耗時(shí)的方法,并來在各種運(yùn)算方式中調(diào)用
- /// <summary>
- /// 獲得數(shù)據(jù)
- /// </summary>
- /// <param name="i"></param>
- /// <returns></returns>
- private static int GetData(int i)
- {
- System.Threading.Thread.Sleep(100);
- return i;
- }
3. 設(shè)計(jì)一般的運(yùn)算方式,調(diào)用GetData方法
- /// <summary>
- /// 采用一般for循環(huán)
- /// </summary>
- private static void UseFor()
- {
- for (int i = 0; i < 20; i++)
- {
- GetData(Datas[i]);
- }
- }
- /// <summary>
- /// 采用一般的foreach
- /// </summary>
- private static void UseForeach()
- {
- foreach (var item in Datas)
- {
- GetData(item);
- }
- }
4.采用并行運(yùn)算的方式,調(diào)用GetData方法
- /// <summary>
- /// 采用并行for循環(huán)
- /// </summary>
- private static void UseParalleFor()
- {
- Parallel.For(0, 20, (i) =>
- {
- GetData(Datas[i]);
- });
- }
- /// <summary>
- /// 采用并行的foreach
- /// </summary>
- private static void UserParalleForeach()
- {
- Parallel.ForEach(Datas, (t) => { GetData(t); });
- }
5.最后采用老趙設(shè)計(jì)的CodeTimer來比較每一種運(yùn)算方式的耗時(shí),在Main函數(shù)中加入測(cè)試代碼
- static void Main(string[] args)
- {
- InitializeData();
- CodeTimer.Initialize();
- CodeTimer.WriteDebug("一般for循環(huán):", 5, () => { UseFor(); });
- CodeTimer.WriteDebug("一般foreach循環(huán):", 5, () => { UseForeach(); });
- CodeTimer.WriteDebug("并行for循環(huán):", 5, () => { UseParalleFor(); });
- CodeTimer.WriteDebug("并行foreach循環(huán):", 5, () => { UserParalleForeach(); });
- Console.Read();
- }
6.運(yùn)算結(jié)果:
可以看出,并行運(yùn)算提高的性能還是比較明顯的。
下面我們把GetData方法修改一下,把線程延遲的的代碼去掉
- /// <summary>
- /// 獲得數(shù)據(jù)
- /// </summary>
- /// <param name="i"></param>
- /// <returns></returns>
- private static int GetData(int i)
- {
- // System.Threading.Thread.Sleep(100);
- return i;
- }
再次運(yùn)行
可以看出,這時(shí)候并行運(yùn)算不但沒降低消耗的時(shí)間,反而用了更多的時(shí)間。經(jīng)過多次測(cè)試發(fā)現(xiàn),采用并行運(yùn)算跟程序的設(shè)計(jì)結(jié)構(gòu)有很大的關(guān)系,如果設(shè)計(jì)不合理,反而會(huì)消耗更多時(shí)間。
原文標(biāo)題:VS2010&.Net 4.0 之并行運(yùn)算(Parallel)(For、Foreach)
鏈接:http://www.cnblogs.com/zya-gis/archive/2009/10/24/1589216.html
【編輯推薦】