淺談Visual Studio 2010並行運算原理

在這裏咱們將介紹Visual Studio 2010並行運算的原理,但願經過本文能對你們瞭解Visual Studio 2010並行運算。這也是你們比價關心的熱點。javascript

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

其實並行運算並非在.Net 4.0纔有的。你們都知道,經過增長CPU的主頻能夠提升CPU的性能,但因爲設計的限制,主頻是不可能無限制的提升。這個時候,把提升性能的方式轉向使用多個心(多核),如今的電腦幾乎都是多核的。但在軟件中並尚未跟上這個節奏,大多數軟件仍是採用傳統的方式,並無很好的發揮多核的優點。java

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

1. 新建一個List,並在開始時初始化函數

  
  
  
  
  1. public static IList<int> Datas = new List<int>();  
  2.  
  3.        static void Main(string[] args)  
  4.        {  
  5.            InitializeData();  
  6.  
  7.              
  8.            Console.Read();  
  9.        }  
  10.  
  11.        /// <summary>  
  12.        /// 初始化數據  
  13.        /// </summary>  
  14.        private static void InitializeData()  
  15.        {  
  16.            Datas.Clear();  
  17.            for (int i = 0; i < 20; i++)  
  18.            {  
  19.                Datas.Add(i);  
  20.            }  
  21.        } 

2.設計耗時的方法,並來在各類運算方式中調用工具

   
   
   
   
  1.  /// <summary>  
  2. /// 得到數據  
  3. /// </summary>  
  4. /// <param name="i"></param>  
  5. /// <returns></returns>  
  6. private static int GetData(int i)  
  7. {  
  8.     System.Threading.Thread.Sleep(100);  
  9.     return i;  

3. 設計通常的運算方式,調用GetData方法    性能

   
   
   
   
  1. /// <summary>  
  2.      /// 採用通常for循環  
  3.      /// </summary>  
  4.      private static void UseFor()  
  5.      {  
  6.          for (int i = 0; i < 20; i++)  
  7.          {  
  8.              GetData(Datas[i]);  
  9.          }  
  10.      }  
  11.  
  12.      /// <summary>  
  13.      /// 採用通常的foreach  
  14.      /// </summary>  
  15.      private static void UseForeach()  
  16.      {  
  17.          foreach (var item in Datas)  
  18.          {  
  19.              GetData(item);  
  20.          }  
  21.      } 

4.採用並行運算的方式,調用GetData方法測試

  
  
  
  
  1. /// <summary>  
  2.       /// 採用並行for循環  
  3.       /// </summary>  
  4.       private static void UseParalleFor()  
  5.       {  
  6.           Parallel.For(0, 20, (i) =>  
  7.           {  
  8.               GetData(Datas[i]);  
  9.           });  
  10.  
  11.       }  
  12.  
  13.       /// <summary>  
  14.       /// 採用並行的foreach  
  15.       /// </summary>  
  16.       private static void UserParalleForeach()  
  17.       {  
  18.           Parallel.ForEach(Datas, (t) => { GetData(t); });  
  19.       } 

5.最後採用老趙設計的CodeTimer來比較每一種運算方式的耗時,在Main函數中加入測試代碼this

  
  
  
  
  1. static void Main(string[] args)  
  2.        {  
  3.            InitializeData();  
  4.  
  5.            CodeTimer.Initialize();  
  6.            CodeTimer.WriteDebug("通常for循環:", 5, () => { UseFor(); });  
  7.            CodeTimer.WriteDebug("通常foreach循環:", 5, () => { UseForeach(); });  
  8.            CodeTimer.WriteDebug("並行for循環:", 5, () => { UseParalleFor(); });  
  9.            CodeTimer.WriteDebug("並行foreach循環:", 5, () => { UserParalleForeach(); });  
  10.  
  11.            Console.Read();  
  12.        } 

6.運算結果:spa

截圖00

 

能夠看出,並行運算提升的性能仍是比較明顯的。

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

   
   
   
   
  1. /// <summary>  
  2. /// 得到數據  
  3. /// </summary>  
  4. /// <param name="i"></param>  
  5. /// <returns></returns>  
  6. private static int GetData(int i)  
  7. {  
  8.    // System.Threading.Thread.Sleep(100);  
  9.     return i;  

再次運行

截圖01

 

能夠看出,這時候並行運算不但沒下降消耗的時間,反而用了更多的時間。通過屢次測試發現,採用並行運算跟程序的設計結構有很大的關係,若是設計不合理,反而會消耗更多時間。

原文標題:VS2010&.Net 4.0 之並行運算(Parallel)(For、Foreach)

連接:http://www.cnblogs.com/zya-gis/archive/2009/10/24/1589216.html

相關文章
相關標籤/搜索