C#4.0入門 第二章 工作平行程式庫—第二頁 活用了核心嗎?

來源:互聯網
上載者:User

真的活用了核心嗎?
對於想確定是不是真正地活用了核心的人,準備了如下的驗證程式。這個程式為,把簡單迴圈所花費的時間分兩次進行計算。但是,第一次使用傳統方法,第二次使用並行方法。

驗證程式

 
using System;
using System.Threading.Tasks;
class Program
{
private const int count = 1000000000;
private static void taro()
{
Console.WriteLine("Taro is busy now");
for (int i = 0; i < count; i++)
;
Console.WriteLine("Taro Done");
}
private static void hanako()
{
Console.WriteLine("Hanako is busy now");
for (int i = 0; i < count; i++)
;
Console.WriteLine("Hanako Done");
}
static void Main(string[] args)
{
DateTime start1 = DateTime.Now;
taro();
hanako();
Console.WriteLine(DateTime.Now - start1);
DateTime start2 = DateTime.Now;
Parallel.Invoke(taro, hanako);
Console.WriteLine(DateTime.Now - start2);
}
}
上例的執行結果(執行debug?build,在雙核心的CPU上運行。後半段中順序可以顛倒。)

 Taro is busy now
Taro Done
Hanako is busy now
Hanako Done
00:00:05.9710000
Taro is busy now
Hanako is busy now
Hanako Done
Taro Done
00:00:03.0320000


如您所見,執行並行計算,只花了大約一半時間就結束了。正是因為把處理分散給兩個核心,才能相差這麼多時間。


另外,因為CPU是有限的資源,所以不應該只是為了等待而使用Thread.Sleep的方法,而是應該把沒有利用的時間轉交給其他的處理。

並存執行foreach語句

實際使用的時候,如果並存執行foreach語句或for語句,可以立刻提高效能。以下為將foreach語句與Parallel.ForEach方法進行比較的例子。

將foreach語句與Parallel.ForEach方法進行比較

 
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
int [] a = {1,2,3,4,5,6,7,8,9};
foreach (var n in a) Console.Write("{0} ",n);
Console.WriteLine("by serial");
Parallel.ForEach(a, (n) => Console.Write("{0} ", n));
Console.WriteLine("by parallel");
}
}
上例的執行結果(後半段中順序可以顛倒。)

 1 2 3 4 5 6 7 8 9 by serial
1 2 3 4 6 7 8 9 5 by parallel


這裡應該注意的是,Parallel.ForEach方法的執行結果與foreach語句的執行結果不一定相同。所以如果元素的順序很重要的話,平行處理就不適合了。

並存執行for語句
對於數值的簡單遍曆迴圈,也可以用並行來處理。

並存執行for語句

 
using System;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 10; i++) Console.Write("{0} ", i);
Console.WriteLine("by serial");
Parallel.For(0, 10, (n) => Console.Write("{0} ", n));
Console.WriteLine("by parallel");
}
}
上例的執行結果(後半段中順序可以顛倒。)

 0 1 2 3 4 5 6 7 8 9 by serial
0 5 1 2 4 8 9 3 6 7 by parallel


但是,並不是所有的for語句都可以用平行處理來實行。同時,do語句和while語句也不能採用平行處理。只有在迴圈開始前迴圈的次數已確定的情況下可以採用平行處理。因為所謂“並行”就是在判定為“迴圈結束”之前,首先要把將要執行的迴圈實現分配好。


基於同樣原因,迴圈處理中如果有break語句退出迴圈,也不能採用平行處理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.