.net並行庫的一些記錄

來源:互聯網
上載者:User

 

 private static void Wrong()

        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Parallel.For(0, 500000, p =>
            {
                int c = p;
            });
            watch.Stop();
            long tempParalleTime = watch.ElapsedMilliseconds;
            watch.Restart();
            for (int i = 0; i < 500000; i++)
            {
                int c = i;
            }
            watch.Stop();
            Console.WriteLine("順序執行用時:" + watch.ElapsedMilliseconds);
            Console.WriteLine("並行庫用時:" + tempParalleTime);
        }

 

 這段並行代碼看似沒問題,可是執行出來的結果如下

明明並行了,為什麼還是慢呢,簡直有些不可思議,其實MSDN上有完整的解釋:

System.Threading.Tasks.Parallel.For loop has a small body, it might perform more slowly than the equivalent sequential loop.’ data-guid=”a5a0118a06f0a1b142f8185f50ced09e”>當 System.Threading.Tasks.Parallel.For 迴圈的迴圈體很小時,它的執行速度可能比等效的順序迴圈更慢。 對資料進行分區所涉及的開銷以及調用每個迴圈迭代上的委託的開銷導致了效能降低。

恩,其實原因就是所謂的迴圈體太小,這裡的迴圈體太小,其實這裡不是指代碼的長度,而是指迴圈體裡面做的事情是否比較費時。其實改寫成下面這樣

 

 private static void Right()

        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Parallel.For(0, 50, p =>
            {
                WebClient wb = new WebClient();
                string content = wb.DownloadString(@"http://www.baidu.com");
            });
            watch.Stop();
            long tempParallelTime = watch.ElapsedMilliseconds;
            watch.Restart();
            for (int i = 0; i < 50; i++)
            {
                WebClient wb = new WebClient();
                string content = wb.DownloadString(@"http://www.baidu.com");
            }
            watch.Stop();
            Console.WriteLine("順序執行用時:" + watch.ElapsedMilliseconds);
            Console.WriteLine("並行庫用時:" + tempParallelTime);
        }

 就會發現

並行庫用時明顯少了,當然,這裡其實更應該用thread.sleep類比下就好,畢竟訪問外部IO是不太穩定的,不過這已經足夠說明問題了。寫這類並行代碼需要注意的地方很多,一個不留神,很有可能比順序執行更慢。

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.