VS2010&.Net 4.0 之并行運算(Parallel)(For、Foreach)

作者: 張亞  來源: 博客園  發布時間: 2010-11-18 22:04  閱讀: 1517 次  推薦: 0   原文鏈接   [收藏]  
摘要:在這里我們將介紹Visual Studio 2010并行運算的原理,希望本文能對大家有所幫助。

  VS2010&.Net 4.0的Beta2相比Beta1在性能上有了很大的改進,已經基本可以使用了。.NET 4.0給我們帶來許多新特性,如動態類型、云平臺、并行運算等。本文討論一下.NET 4.0的并行運算。

  其實并行運算并不是在.Net 4.0才有的。大家都知道,通過增加CPU的主頻可以提高CPU的性能,但由于設計的限制,主頻是不可能無限制的提高。這個時候,把提高性能的方式轉向使用多個心(多核),現在的電腦幾乎都是多核的。但在軟件中并還沒有跟上這個節奏,大多數軟件還是采用傳統的方式,并沒有很好的發揮多核的優勢。

  微軟的并行運算平臺(Microsoft’s Parallel Computing Platform (PCP))提供了這樣一個工具,讓軟件開發人員可以有效的使用多核提供的性能。本文就進行一個簡單的測試,來體驗并行運算的性能。

  1. 新建一個List,并在開始時初始化

public static IList<int> Datas = new List<int>();

       static void Main(string[] args)
       {
           InitializeData();

           
           Console.Read();
       }

       /// <summary>
       /// 初始化數據
       /// </summary>
       private static void InitializeData()
       {
           Datas.Clear();
           for (int i = 0; i < 20; i++)
           {
               Datas.Add(i);
           }
       }

  2.設計耗時的方法,并來在各種運算方式中調用

       /// <summary>
      /// 獲得數據
      /// </summary>
      /// <param name="i"></param>
      /// <returns></returns>
      private static int GetData(int i)
      {
          System.Threading.Thread.Sleep(100);
          return i;
      }

  3. 設計一般的運算方式,調用GetData方法

        /// <summary>
       /// 采用一般for循環
       /// </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.采用并行運算的方式,調用GetData方法

        /// <summary>
       /// 采用并行for循環
       /// </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.最后采用老趙設計的CodeTimer來比較每一種運算方式的耗時,在Main函數中加入測試代碼

static void Main(string[] args)
       {
           InitializeData();

           CodeTimer.Initialize();
           CodeTimer.WriteDebug("一般for循環:", 5, () => { UseFor(); });
           CodeTimer.WriteDebug("一般foreach循環:", 5, () => { UseForeach(); });
           CodeTimer.WriteDebug("并行for循環:", 5, () => { UseParalleFor(); });
           CodeTimer.WriteDebug("并行foreach循環:", 5, () => { UserParalleForeach(); });

           Console.Read();
       }

  6.運算結果:

截圖00

  可以看出,并行運算提高的性能還是比較明顯的。

  下面我們把GetData方法修改一下,把線程延遲的的代碼去掉

/// <summary>
/// 獲得數據
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
private static int GetData(int i)
{
   // System.Threading.Thread.Sleep(100);
    return i;
}

  再次運行

截圖01

  可以看出,這時候并行運算不但沒降低消耗的時間,反而用了更多的時間。經過多次測試發現,采用并行運算跟程序的設計結構有很大的關系,如果設計不合理,反而會消耗更多時間。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()