前兩天看書發現了一個新的循環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創建線程會耗時,如果循環里面的內容太簡單的話法爾得不償失