国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 淺談.Net并行計算之數據并行

淺談.Net并行計算之數據并行

2019-11-24 14:36ASP.NET教程網 ASP.NET教程

這篇文章主要介紹了.Net并行計算之數據并行,有需要的朋友可以參考一下

從第一臺計算機問世到現在計算機硬件技術已經有了很大的發展。不管是現在個人使用的PC還是公司使用的服務器。雙核,四核,八核的CPU已經非常常見。這樣我們可以將我們程序分攤到多個計算機CPU中去計算,在過去并行化需要線程的低級操作,難度很大,在.net4.0中的增強了對并行化的支持,使得這一切變得非常簡單 。本次我從以下幾個方面大家講以下.NET 并行

1.      數據并行
2.      任務并行
3.      并行Linq
4.      任務工廠
5.      注意事項
    

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

   數據并行其實就是指對原集合或者數組中的數據進行劃區之后分攤到多個CPU或者多個線程執行相同的操作 在 .net中的 System.Threading.Tasks 提供了對數據并行的支持類 , Parallel.For,Parallel.ForEach和我們經常的使用的for 和foreach 十分的相似,你不用創建線程隊列,在基本的循環中你不用使用鎖。這些.net 會幫你處理,你只需要關注你自己的業務  那下面我們就來看看 Parallel.For 和 Parallel.ForEach 是如何使用的

•     Parallel.For 簡單使用

 

復制代碼代碼如下:

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

 

上面的例子是不是和我們經常使用的for循環的影子。 說一下 Parallel.For 的第三個參數Action<int>類型的委托 不管這個委托的參數是0個還是多少個他的返回植都是void,那么怎么樣才能獲取到Parallel.For 中的的返回值了,下面的例子將演示如何使用線程本地變量來存儲和檢索由 for 循環創建的每個單獨任務中的狀態  通過使用線程本地數據,您可以避免將大量的訪問同步為共享狀態的開銷。  在任務的所有迭代完成之前,您將計算和存儲值,而不是寫入每個迭代上的共享資源。  然后,您可以將最終結果一次性寫入共享資源,或將其傳遞到另一個方法

•對個list<int> 進行求和我們這里假設List的長度為listLength 

復制代碼代碼如下:


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

 

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

 

•在現實中我們也經常會遇到需要取消循環的情況。比如你在隊列中查找一個數。那么如何退出Parallel.For 循環了。是不是也是和for 和foreach那樣 使用Break關鍵字就可以了,答案否定的。這是因為break 構造對循環是有效的,而并行循環其實是一個方法,并不是循環 那么要怎么樣取消了。請看下面的例子

復制代碼代碼如下:


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

 

                subsum += lista[j];
                return subsum;

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

 

• 簡單Parallel.ForEach 循環     Parallel.ForEach循環的工作方式類似于 Parallel.For 循環 根據系統環境,對源集合進行分區,并在多個線程上計劃工作。  系統中的處理器越多,并行方法的運行速度越快。  對于某些源集合,順序循環可能更快,具體取決于源的大小和正在執行的工作類型

 

復制代碼代碼如下:

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

 

 不知道大家在這個地方有沒有看到foreach的影子。其實上面的例子中的ForEach方法的最后一個輸入參數是 Action<int>委托,當所有循環完成時,方法將調用該委托。這個地方和前面的Parallel.For 是一樣的。那么我們要如何獲得返回值了和上面的For是非常相似,我依然以上面數組求和為例

 

復制代碼代碼如下:


Parallel.ForEach<int, 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 性能測試比較 我們這里產生1千萬個隨機數為例子做個一個性能比較,在筆者的筆記本上結果如下 (可能在你的電腦上得到結果不一定相同)
淺談.Net并行計算之數據并行

附上相關的代碼給大家參考

 

復制代碼代碼如下:


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

 

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

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

        
            Stopwatch watch2 = Stopwatch.StartNew();

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


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

 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 中文字幕第一页在线 | 精久久 | 桃色视频在线播放 | 夜夜爽99久久国产综合精品女不卡 | 国产精品亚洲精品 | 日韩操操操 | 成人高清在线视频 | 免费一区二区三区 | 国产区在线 | 日韩一区二区福利 | 国产美女在线观看 | 亚洲自拍偷拍精品 | 亚洲精品国产综合区久久久久久久 | 国产精品一区二区久久 | 黄毛片网站 | 青青草原亚洲 | 中文字幕三区 | 操操网| 色综合欧美| 日本日韩中文字幕 | 欧美三区 | 嫩草网址 | av大全在线| 亚洲精品影院在线 | 亚洲免费看片 | 亚洲精品在线视频 | www.久久久久久久 | 日韩av片无码一区二区不卡电影 | 99999色| 国产高清精品一区 | k8久久久一区二区三区 | 亚洲欧美综合精品久久成人 | 久久久国产视频 | 91精品久久久久久久久 | 亚洲免费色 | 青青草欧美| 亚洲日本乱码在线观看 | 91国内外精品自在线播放 | 亚洲视频区 | 黄a在线 | 天天久久|