Visual Studio 2010中Parallel類實現(xiàn)并行計算
將要跟隨Visual Studio 2010一起發(fā)布的.NET Framework 4.0將包含很多基于庫的對并行計算的支持,包括數(shù)據(jù)的并行化,任務(wù)的并行化等等,這一切都通過一個共同的工作調(diào)度器進行管理。
這些新的類型和類,將在System.Threading,System.Threading.Tasks,System.Linq和System.Collections.Concurrent這些名字空間中提供。通過這些新的類型和類,開發(fā)人員將無需面對如今復(fù)雜的多線程開發(fā)模式,而可以直接使用.NET Framework,更加高效簡便地開發(fā)支持并行計算的應(yīng)用程序,從而更加充分地利用多核CPU的優(yōu)勢,隨著計算核心或者處理器的增加,以提升應(yīng)用程序的性能。
而在.NET Framework中,Task Parallel Library (TPL)是其Parallel Extensions中一個重要組成部分,它提供了一種簡便的多線程開發(fā)方式,通過它所提供的類或者函數(shù),可以讓程序員輕松地實現(xiàn)并行計算。其中,最簡單的就是它的Parallel類
Parallel類
Parallel類就是TPL中的一個用于支持并行計算的類。Parallel類提供了諸多的靜態(tài)函數(shù),只需要簡單的函數(shù)調(diào)用,我們就可以對常用的for循環(huán),foreach循環(huán)進行并行化。下面我們通過一些實際的例子,來看看如何利用這個類將我們的應(yīng)用程序并行化,以吃上多核這“免費的午餐”。
創(chuàng)建示例項目
為了演示如何將一個現(xiàn)有的項目并行化,我們需要先創(chuàng)建一個示例項目。在這個項目中,我們將模擬對數(shù)據(jù)的串行操作,然后介紹如何利用Parallel類將對數(shù)據(jù)的串行操作并行化,以充分利用多核CPU的優(yōu)勢,從而提升應(yīng)用程序的性能。在Visual Studio 2010中,我們新創(chuàng)建一個Visual C#的控制臺應(yīng)用程序。然后在這個項目中添加一個類Employee,其實現(xiàn)代碼如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace ParallelDemo
- {
- // 職員類
- public class Employee
- {
- public string FirstName
- {
- get;
- set;
- }
- public string LastName
- {
- get;
- set;
- }
- public string Address
- {
- get;
- set;
- }
- public DateTime HireDate
- {
- get;
- set;
- }
- public int EmployeeID
- {
- get;
- set;
- }
- // 模擬對數(shù)據(jù)的處理
- public static decimal Process(Employee employee)
- {
- Console.WriteLine(”Processing {0}”, employee.EmployeeID);
- // 產(chǎn)生一個隨機數(shù)
- // 用以表示處理當(dāng)前數(shù)據(jù)需要的時間
- var rand = new Random(DateTime.Now.Millisecond);
- var delay = rand.Next(1, 5);
- var count = 0;
- var process = true;
- while (process)
- {
- System.Threading.Thread.Sleep(1000);
- count++;
- if (count >= delay)
- process = false;
- }
- return delay;
- }
- }
- // 職員列表類
- // 這是我們需要處理的數(shù)據(jù)
- public class EmployeeList : List
- {
- public EmployeeList()
- {
- // 將職員添加到列表中
- Add(new Employee { EmployeeID = 1, FirstName = “張”, LastName = “三”, HireDate = DateTime.Parse(”1/1/2007″) });
- Add(new Employee { EmployeeID = 2, FirstName = “李”, LastName = “四”, HireDate = DateTime.Parse(”3/15/2006″) });
- Add(new Employee { EmployeeID = 3, FirstName = “王”, LastName = “麻子”, HireDate = DateTime.Parse(”6/17/2005″) });
- Add(new Employee { EmployeeID = 4, FirstName = “趙”, LastName = “匡胤”, HireDate = DateTime.Parse(”3/19/2000″) });
- Add(new Employee { EmployeeID = 5, FirstName = “錢”, LastName = “進”, HireDate = DateTime.Parse(”7/17/2003″) });
- Add(new Employee { EmployeeID = 6, FirstName = “孫”, LastName = “俊鵬”, HireDate = DateTime.Parse(”9/13/2005″) });
- Add(new Employee { EmployeeID = 7, FirstName = “李”, LastName = “明”, HireDate = DateTime.Parse(”12/3/2002″) });
- Add(new Employee { EmployeeID = 8, FirstName = “周”, LastName = “大勇”, HireDate = DateTime.Parse(”7/1/2008″) });
- Add(new Employee { EmployeeID = 9, FirstName = “吳”, LastName = “明子”, HireDate = DateTime.Parse(”1/7/2008″) });
- Add(new Employee { EmployeeID = 10, FirstName = “鄭”, LastName = “邦萬”, HireDate = DateTime.Parse(”11/1/2001″) });
- Add(new Employee { EmployeeID = 11, FirstName = “王”, LastName = “朝”, HireDate = DateTime.Parse(”4/21/2006″) });
- Add(new Employee { EmployeeID = 12, FirstName = “馮”, LastName = “瑪麗”, HireDate = DateTime.Parse(”7/19/2006″) });
- Add(new Employee { EmployeeID = 13, FirstName = “陳”, LastName = “良喬”, HireDate = DateTime.Parse(”3/9/2001″) });
- Add(new Employee { EmployeeID = 14, FirstName = “褚”, LastName = “春暉”, HireDate = DateTime.Parse(”7/15/2005″) });
- Add(new Employee { EmployeeID = 15, FirstName = “衛(wèi)”, LastName = “斯理”, HireDate = DateTime.Parse(”8/6/2003″) });
- Add(new Employee { EmployeeID = 16, FirstName = “蔣”, LastName = “中正”, HireDate = DateTime.Parse(”5/18/2005″) });
- Add(new Employee { EmployeeID = 17, FirstName = “沈”, LastName = “洋洋”, HireDate = DateTime.Parse(”8/5/2002″) });
- Add(new Employee { EmployeeID = 18, FirstName = “韓”, LastName = “斌”, HireDate = DateTime.Parse(”10/1/2006″) });
- Add(new Employee { EmployeeID = 19, FirstName = “楊”, LastName = “雪”, HireDate = DateTime.Parse(”12/7/2002″) });
- Add(new Employee { EmployeeID = 20, FirstName = “朱”, LastName = “輝”, HireDate = DateTime.Parse(”3/30/2001″) });
- DateTime.Parse(”12/7/2002″) });
- Add(new Employee { EmployeeID = 20, FirstName = “朱”, LastName = “輝”, HireDate = DateTime.Parse(”3/30/2001″) });
- }
- }
- }
- }
- }
- }
【編輯推薦】