真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.NET并行編程實踐(一:.NET并行計算基本介紹、并行循環(huán)使用模式)

閱讀目錄:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、珙縣網(wǎng)站維護(hù)、網(wǎng)站推廣。

  • 1.開篇介紹

  • 2.NET并行計算基本介紹

  • 3.并行循環(huán)使用模式

    • 3.1并行For循環(huán)

    • 3.2并行ForEach循環(huán)

    • 3.3并行LINQ(PLINQ)

1】開篇介紹

最近這幾天在搗鼓并行計算,發(fā)現(xiàn)還是有很多值得分享的意義,因為我們現(xiàn)在很多人對它的理解還是有點不準(zhǔn)確,包括我自己也是這么覺得,所以整理一些文章分享給在使用.NET并行計算的朋友和將要使用.NET并行計算的朋友;

NET并行編程推出已經(jīng)有一段時間了,在一些項目代碼里也時不時會看見一些眼熟的并行計算代碼,作為熱愛技術(shù)的我們怎能視而不見呢,于是搗鼓了一番跟自己的理解恰恰相反,看似一段能提高處理速度的并行代碼為能起效果,跟直接使用手動創(chuàng)建的后臺線程處理差不多,這不太符合我們對.NET并行的強(qiáng)大技術(shù)的理解,所以自己搞了點資料看看,實踐了一下,發(fā)現(xiàn)在使用.NET并行技術(shù)的時候需要注意一些細(xì)節(jié),這些細(xì)節(jié)看代碼是看不出來的,所以我們看到別人這么用我們就模仿這么用,我們需要自己去驗證一下到底能提高多少處理速度和它的優(yōu)勢在哪里;要不然效率上不去反而還低下,查看代碼也不能很好的斷定哪里出了問題,所以還是需要系統(tǒng)的學(xué)習(xí)總結(jié)才行;

現(xiàn)在的系統(tǒng)已經(jīng)不在是以前桌面程序了,也不是簡單的WEB應(yīng)用系統(tǒng),而是大型的互聯(lián)網(wǎng)社區(qū)、電子商務(wù)等大型系統(tǒng),具有高并發(fā),大數(shù)據(jù)、SOA這些相關(guān)特性的復(fù)雜體系的綜合性開放平臺;.NET作為市場占有率這么高的開發(fā)技術(shù),有了一個很強(qiáng)大的并行處理技術(shù),目的就是為了能在高并發(fā)的情況下提高處理效率,提高了單個并發(fā)的處理效率也就提高了總體的系統(tǒng)的吞吐量和并發(fā)數(shù)量,在單位時間內(nèi)處理的數(shù)據(jù)量將提高不是一個系數(shù)兩個系數(shù);一個處理我們提高了兩倍到三倍的時間,那么在并發(fā)1000萬的頂峰時時不時很客觀;

2】.NET并行計算基本介紹

既然是.NET并行計算,那么我們首先要弄清楚什么叫并行計算,與我們以前手動創(chuàng)建多線程的并行計算有何不同,好處在哪里;我們先來了解一下什么是并行計算,其實簡單形容就是將一個大的任務(wù)分解成多個小任務(wù),然后讓這些小任務(wù)同時的進(jìn)行處理,當(dāng)然純屬自己個人理解,當(dāng)然不是很全面,但是我們使用者來說足夠了;

在以前單個CPU的情況下只能靠提高CPU的時鐘頻率,但是畢竟是有極限的,所以現(xiàn)在基本上是多核CPU,個人筆記本都已經(jīng)基本上是4核了,服務(wù)器的話都快上20了;在這樣一個有利的計算環(huán)境下,我們的程序在處理一個大的任務(wù)時為了提高處理速度需要手動的將它分解然后創(chuàng)建Thread來處理,在.NET中我們一般都會自己創(chuàng)建Thread來處理單個子任務(wù),這大家都不陌生,但是我們面臨的問題就是不能很好的把握創(chuàng)建Thread的個數(shù)和一些參數(shù)的控制,畢竟.NET并行也是基于以前的Thread來寫的,如何在多線程之間控制參數(shù),如何互斥的執(zhí)行的線程順序等等問題,導(dǎo)致我們不能很好的使用Thread,所以這個時候.NET并行框架為我們提供了一個很好的并行開發(fā)平臺,畢竟大環(huán)境就是多核時代;

下面我們將接觸.NET并行計算中的第一個使用模式,有很多并行計算場景,歸結(jié)起來是一系列使用模式;

3】并行循環(huán)模式

并行循環(huán)模式就是將一個大的循環(huán)任務(wù)分解成多個同時并行執(zhí)行的小循環(huán),這個模式很實用;我們大部分處理程序的邏輯都是在循環(huán)和判斷之間,并行循環(huán)模式可以適當(dāng)?shù)母纳莆覀冊诓僮鞔罅垦h(huán)邏輯的效率;

我們看一個簡單的例子,看到底提升了多少CPU利用率和執(zhí)行時間;

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Diagnostics;
namespace ConsoleApplication1.Data
{
    public class DataOperation
    {
        private static List orders = new List();
        static DataOperation()
        {
            for (int i = 0; i < 9000000; i++)
            {
                orders.Add(new Order() { Oid = Guid.NewGuid().ToString(), OName = "OrderName_" + i.ToString() });
            }
        }
        public void Operation()
        {
            Console.WriteLine("Please write start keys:");
            Console.ReadLine();
            Stopwatch watch = new Stopwatch();
            watch.Start();
            orders.ForEach(order =>
            {
                order.IsSubmit = true;
                int count = 0;
                for (int i = 0; i < 2000; i++)
                {
                    count++;
                }
            });
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds);
        }
        public void TaskOperation()
        {
            Console.WriteLine("Please write start keys:");
            Console.ReadLine();
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Parallel.ForEach(orders, order =>
            {
                order.IsSubmit = true;
                int count = 0;
                for (int i = 0; i < 2000; i++)
                {
                    count++;
                }
            });
            watch.Stop();
            Console.WriteLine(watch.ElapsedMilliseconds);
        }
    }
}

這里的代碼其實很簡單,在靜態(tài)構(gòu)造函數(shù)中我初始化了九百萬條測試數(shù)據(jù),其實就是Order類型的實例,這在我們實際應(yīng)用中也很常見,只不過不是一次性的讀取這么多數(shù)據(jù)而已,但是處理的方式基本上差不多的;然后有兩個方法,一個是Operation,一個是TaskOperation,前者順序執(zhí)行,后者并行執(zhí)行;

在循環(huán)的內(nèi)部我加上了一個2000的簡單空循環(huán)邏輯,為什么要這么做后面會解釋介紹(小循環(huán)并行模式不會提升性能反而會降低性能);這里是為了讓模擬場景更真實一點;

我們來看一下測試相關(guān)的數(shù)據(jù):i5、4核測試環(huán)境,執(zhí)行時間為42449毫秒,CPU使用率為25%左右,4核中只使用了1和3的,而其他的都屬于一般處理狀態(tài);

圖1:

.NET并行編程實踐(一:.NET并行計算基本介紹、并行循環(huán)使用模式)

我們再來看一下使用并行計算后的相關(guān)數(shù)據(jù):i5、4核測試環(huán)境,執(zhí)行時間為19927毫秒,CPU利用率為100%,4核中全部到達(dá)頂峰;

圖2:

.NET并行編程實踐(一:.NET并行計算基本介紹、并行循環(huán)使用模式)

這一個簡單的測試?yán)?,?dāng)然我只測試了兩三組數(shù)據(jù),基本上并行計算的速度要快于單線程的處理速度的2.1倍以上,當(dāng)然還有其他因素在里面這里就不仔細(xì)分析了,起到拋磚引玉的作用;

3.1】并行For循環(huán)

在使用for循環(huán)的時候有相應(yīng)的Parallel方式使用for循環(huán),我們直接看一下示例代碼,還是以上面的測試數(shù)據(jù)為例;

Parallel.For(0, orders.Count, index =>
            {
                //
            });

第一個參數(shù)是索引的開始,第二個參數(shù)是循環(huán)總數(shù),第三個是執(zhí)行體,參數(shù)是索引值;使用起來其實很簡單的;

3.2】并行ForEach循環(huán)

同樣ForEach也是很簡單的,還是使用上面的測試數(shù)據(jù)為例;

Parallel.ForEach(orders, order =>
            {
                order.IsSubmit = true;
                int count = 0;
                for (int i = 0; i < 2000; i++)
                {
                    count++;
                }
            });

在Parallel類中有ForEach方法,第一個參數(shù)是迭代集合,第二個是每次迭代的item;

其實Parallel為我們封裝了一個簡單的調(diào)用入口,其實是依附于后臺的Task框架的,因為我們常用的就是循環(huán)比較多,畢竟循環(huán)是任務(wù)的入口調(diào)用,所以我們使用并行循環(huán)的時候還是很方便的;

3.3】并行LINQ(PLINQ)

首先PLINQ是只針對Linq to Object的,所以不要誤以為它也可以使用于Linq to Provider,當(dāng)然自己可以適當(dāng)?shù)姆庋b;現(xiàn)在LINQ的使用率已經(jīng)很高了,我們在做對象相關(guān)的操作時基本上都在使用LINQ,很方便,特別是Select、Where非常的常用,所以.NET并行循環(huán)也在LINQ上進(jìn)行了一個封裝,讓我們使用LINQ的時候很簡單的使用并行特性;

LINQ核心原理的文章:http://www.cnblogs.com/wangiqngpei557/category/421145.html

根據(jù)LINQ的相關(guān)原理,知道LINQ是一堆擴(kuò)展方法的鏈?zhǔn)秸{(diào)用,PLINQ就是擴(kuò)展方法的集合,位于System.Linq.ParallelEnumerable靜態(tài)類中,擴(kuò)展于ParallelQuery泛型類;

System.Linq.ParallelQuery類:

using System.Collections;
using System.Collections.Generic;
namespace System.Linq
{
    // 摘要:
    //     表示并行序列。
    //
    // 類型參數(shù):
    //   TSource:
    //     源序列中的元素的類型。
    public class ParallelQuery : ParallelQuery, IEnumerable, IEnumerable
    {
        // 摘要:
        //     返回循環(huán)訪問序列的枚舉數(shù)。
        //
        // 返回結(jié)果:
        //     循環(huán)訪問序列的枚舉數(shù)。
        public virtual IEnumerator GetEnumerator();
    }
}

System.Linq.ParallelEnumerable類:

// 摘要:
    //     提供一組用于查詢實現(xiàn) ParallelQuery{TSource} 的對象的方法。 這是 System.Linq.Enumerable 的并行等效項。
    public static class ParallelEnumerable

我們在用的時候只需要將它原本的類型轉(zhuǎn)換成ParallelQuery類型就行了;

var items = from item in orders.AsParallel() where item.OName.Contains("1") select item;

Linq 的擴(kuò)展性真的很方便,可以隨意的封裝任何跟查詢相關(guān)的接口;

作者:王清培

出處:http://wangqingpei557.blog.51cto.com/

本文版權(quán)歸作者和51CTO共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。



文章名稱:.NET并行編程實踐(一:.NET并行計算基本介紹、并行循環(huán)使用模式)
網(wǎng)址分享:http://weahome.cn/article/gsjhso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部