1. 程式人生 > >Parallel.For迴圈與普通的for迴圈

Parallel.For迴圈與普通的for迴圈

前兩天看書發現了一個新的迴圈Parallel.For,這個迴圈在迴圈期間可以建立多個執行緒並行迴圈,就是說迴圈的內容是無序的。這讓我想到了我前面的牛牛模擬計算是可以用到這個迴圈的,我前面的牛牛模擬計算是重複同樣的操作10萬次,可以是無序的,用Parallel.For會節省不少時間,如果是需要有序的迴圈不要使用Parallel.For。還有一點,如果迴圈裡面的內容很簡單,單一,建議還是使用普通的for迴圈會快一些。

下面是Parallel.For與for的用時對比

 var dt = DateTime.Now;
            var rand = new Random(DateTime.Now.Millisecond);
            for (int i = 0; i < 20; i++)
            {
                Thread.Sleep(rand.Next(100, 1000));
            }
            var standerTime = (DateTime.Now - dt).TotalMilliseconds;
            Console.WriteLine("標準的for迴圈,耗時{0}毫秒", standerTime);
            dt = DateTime.Now;
            Parallel.For(0, 20, i =>
            {
                Thread.Sleep(rand.Next(100, 1000));
            });
            var parallelTime = (DateTime.Now - dt).TotalMilliseconds;
            Console.WriteLine("並行的for迴圈,耗時{0}毫秒", parallelTime);
            Console.WriteLine();
            if (standerTime <= parallelTime)
            {
                Console.WriteLine("----------標準的for迴圈節省{0}毫秒----------", (parallelTime - standerTime));
            }
            else
            {
                Console.WriteLine("----------並行的for迴圈節省{0}毫秒----------", (standerTime - parallelTime));
            }
            Console.ReadKey();

上面是Parallel.For比較快的情況

下面是for比較快的情況

 Stopwatch sw = new Stopwatch();
            sw.Start();

            ParallelLoopResult result =
            Parallel.For(0, 10000, i =>
            {
                Console.Write("");

            });
            sw.Stop();
            TimeSpan ts2 = sw.Elapsed;
            Console.WriteLine("Parallel.For總共花費{0}ms.", ts2.TotalMilliseconds);

            //
            Stopwatch sw_Eq = new Stopwatch();
            sw_Eq.Start();
            for (int i = 0; i < 10000; i++)
            {
                Console.Write(""); 
            }
            sw_Eq.Stop();
            TimeSpan tssw_Eq = sw_Eq.Elapsed;
            Console.WriteLine("for總共花費{0}ms.", tssw_Eq.TotalMilliseconds);
            Console.ReadKey();

由此可見,Parallel.For建立執行緒會耗時,如果迴圈裡面的內容太簡單的話法爾得不償失