濮阳杆衣贸易有限公司

主頁 > 知識庫 > 淺談.Net并行計(jì)算之?dāng)?shù)據(jù)并行

淺談.Net并行計(jì)算之?dāng)?shù)據(jù)并行

熱門標(biāo)簽:電銷機(jī)器人 數(shù)據(jù) ai電銷機(jī)器人對貸款有幫助嗎 怎樣給陜西地圖標(biāo)注顏色 福州人工智能電銷機(jī)器人加盟 宿遷智能外呼系統(tǒng)排名 400電話辦理信任翰諾科技 云狐人工智能電話機(jī)器人 地圖標(biāo)注多少錢一張 廣州銷售外呼系統(tǒng)定制

從第一臺計(jì)算機(jī)問世到現(xiàn)在計(jì)算機(jī)硬件技術(shù)已經(jīng)有了很大的發(fā)展。不管是現(xiàn)在個(gè)人使用的PC還是公司使用的服務(wù)器。雙核,四核,八核的CPU已經(jīng)非常常見。這樣我們可以將我們程序分?jǐn)偟蕉鄠€(gè)計(jì)算機(jī)CPU中去計(jì)算,在過去并行化需要線程的低級操作,難度很大,在.net4.0中的增強(qiáng)了對并行化的支持,使得這一切變得非常簡單 。本次我從以下幾個(gè)方面大家講以下.NET 并行

1.      數(shù)據(jù)并行
2.      任務(wù)并行
3.      并行Linq
4.      任務(wù)工廠
5.      注意事項(xiàng)
    

  本次主要給大家講一下數(shù)據(jù)并行 廢話不說,下面開始了

   數(shù)據(jù)并行其實(shí)就是指對原集合或者數(shù)組中的數(shù)據(jù)進(jìn)行劃區(qū)之后分?jǐn)偟蕉鄠€(gè)CPU或者多個(gè)線程執(zhí)行相同的操作 在 .net中的 System.Threading.Tasks 提供了對數(shù)據(jù)并行的支持類 , Parallel.For,Parallel.ForEach和我們經(jīng)常的使用的for 和foreach 十分的相似,你不用創(chuàng)建線程隊(duì)列,在基本的循環(huán)中你不用使用鎖。這些.net 會幫你處理,你只需要關(guān)注你自己的業(yè)務(wù)  那下面我們就來看看 Parallel.For 和 Parallel.ForEach 是如何使用的

•     Parallel.For 簡單使用

復(fù)制代碼 代碼如下:

   Parallel.For(0, 100, i => {
                dosameting()
            });

上面的例子是不是和我們經(jīng)常使用的for循環(huán)的影子。 說一下 Parallel.For 的第三個(gè)參數(shù)Actionint>類型的委托 不管這個(gè)委托的參數(shù)是0個(gè)還是多少個(gè)他的返回植都是void,那么怎么樣才能獲取到Parallel.For 中的的返回值了,下面的例子將演示如何使用線程本地變量來存儲和檢索由 for 循環(huán)創(chuàng)建的每個(gè)單獨(dú)任務(wù)中的狀態(tài)  通過使用線程本地?cái)?shù)據(jù),您可以避免將大量的訪問同步為共享狀態(tài)的開銷。  在任務(wù)的所有迭代完成之前,您將計(jì)算和存儲值,而不是寫入每個(gè)迭代上的共享資源。  然后,您可以將最終結(jié)果一次性寫入共享資源,或?qū)⑵鋫鬟f到另一個(gè)方法

•對個(gè)listint> 進(jìn)行求和我們這里假設(shè)List的長度為listLength

復(fù)制代碼 代碼如下:

   Parallel.Forlong>(0, listLength, () => 0, (j, loop, subsum) =>
            {
                subsum += lista[j];
                return subsum;

            }, (x) => Interlocked.Add(ref sum, x));

•在現(xiàn)實(shí)中我們也經(jīng)常會遇到需要取消循環(huán)的情況。比如你在隊(duì)列中查找一個(gè)數(shù)。那么如何退出Parallel.For 循環(huán)了。是不是也是和for 和foreach那樣 使用Break關(guān)鍵字就可以了,答案否定的。這是因?yàn)閎reak 構(gòu)造對循環(huán)是有效的,而并行循環(huán)其實(shí)是一個(gè)方法,并不是循環(huán) 那么要怎么樣取消了。請看下面的例子

復(fù)制代碼 代碼如下:

Parallel.Forlong>(0, listLength, () => 0, (j, loop, subsum) =>
            {
                if (subsum > 20000)
                {
                    loop.Break();
                }

                subsum += lista[j];
                return subsum;

            }, (x) => Interlocked.Add(ref sum, x));

• 簡單Parallel.ForEach 循環(huán)     Parallel.ForEach循環(huán)的工作方式類似于 Parallel.For 循環(huán) 根據(jù)系統(tǒng)環(huán)境,對源集合進(jìn)行分區(qū),并在多個(gè)線程上計(jì)劃工作。  系統(tǒng)中的處理器越多,并行方法的運(yùn)行速度越快。  對于某些源集合,順序循環(huán)可能更快,具體取決于源的大小和正在執(zhí)行的工作類型

復(fù)制代碼 代碼如下:

   Parallel.ForEach(lista, i => { dosameting(); });

 不知道大家在這個(gè)地方有沒有看到foreach的影子。其實(shí)上面的例子中的ForEach方法的最后一個(gè)輸入?yún)?shù)是 Actionint>委托,當(dāng)所有循環(huán)完成時(shí),方法將調(diào)用該委托。這個(gè)地方和前面的Parallel.For 是一樣的。那么我們要如何獲得返回值了和上面的For是非常相似,我依然以上面數(shù)組求和為例

復(fù)制代碼 代碼如下:

Parallel.ForEachint, long>(lista, () => 0, (j, loop, subsum) =>
       {
           if (subsum > 20000)
           {
               loop.Break();
           }

           subsum += lista[j];
           return subsum;

       }, (x) => Interlocked.Add(ref sum, x));

• Parallel.For 和for 性能測試比較 我們這里產(chǎn)生1千萬個(gè)隨機(jī)數(shù)為例子做個(gè)一個(gè)性能比較,在筆者的筆記本上結(jié)果如下 (可能在你的電腦上得到結(jié)果不一定相同)

附上相關(guān)的代碼給大家參考

復(fù)制代碼 代碼如下:

int listLength = 10000000;
            Listint> listTask = new Listint>();
            Listint> list = new Listint>();
            Stopwatch watch1 = Stopwatch.StartNew();

            Parallel.For(0, listLength, i => {
                Random r = new Random(100);
                listTask.Add(r.Next());

            });
            Console.WriteLine("并行耗時(shí):" + watch1.ElapsedMilliseconds );
           

       
            Stopwatch watch2 = Stopwatch.StartNew();

            for (int i = 0; i listLength; i++)
            {
                Random r = new Random(100);
                list.Add(r.Next());
            }


            Console.WriteLine("非并行耗時(shí):" + watch2.ElapsedMilliseconds );

您可能感興趣的文章:
  • js數(shù)值計(jì)算時(shí)使用parseInt進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換(jquery)
  • 用asp實(shí)現(xiàn)訪問遠(yuǎn)程計(jì)算機(jī)上MDB access數(shù)據(jù)庫文件的方法
  • Access使用查詢--1.2.用選擇查詢進(jìn)行分組數(shù)據(jù)的計(jì)算
  • 數(shù)據(jù)計(jì)算中間件技術(shù)綜述

標(biāo)簽:綿陽 延安 焦作 宜春 大興安嶺 黃南 曲靖 新疆

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談.Net并行計(jì)算之?dāng)?shù)據(jù)并行》,本文關(guān)鍵詞  淺談,.Net,并行,計(jì)算,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談.Net并行計(jì)算之?dāng)?shù)據(jù)并行》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談.Net并行計(jì)算之?dāng)?shù)據(jù)并行的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    白山市| 富宁县| 五莲县| 奉节县| 老河口市| 宜兰县| 西畴县| 商城县| 阳泉市| 乐昌市| 万荣县| 五家渠市| 京山县| 华池县| 云浮市| 桦南县| 马山县| 定兴县| 平顶山市| 班玛县| 策勒县| 扎兰屯市| 扬中市| 陆丰市| 微博| 察雅县| 新野县| 浙江省| 阳高县| 定兴县| 京山县| 泰和县| 永寿县| 无棣县| 沽源县| 垫江县| 米泉市| 宁夏| 乐清市| 砚山县| 惠水县|