.NET 4.0并行计算测试
时间:2011-02-06 来源:saville
首先进行一下简单计算的测试,实现从1到10000000的累加。
代码static void SimpleTest()
{
Stopwatch watch = new Stopwatch();
watch.Start();
Parallel.For(1, 10000000, (i) => { i ++; });
watch.Stop();
Console.WriteLine("Parallel test:" + watch.ElapsedMilliseconds.ToString());
watch.Restart();
for (int i = 1; i < 10000000; i++)
{
i ++;
}
watch.Stop();
Console.WriteLine("test:" + watch.ElapsedMilliseconds.ToString());
}
测试结果如下:
不是吧?并行计算效果怎么还不如普通的for循环呢?查询了一下MSDN顿时释然了,当并行循环运行时,TPL 会对数据源进行分区,以便循环能够同时对多个部分进行操作,而对数据进行分区势必带来一定的开销,从而导致这类简单计算性能降低。
那就测试一下复杂一点的计算吧,试试斐波那契数列的计算。
代码static long Fibonacci(this int i)代码
{
long sum;
if (i == 0)
{
sum = 0;
}
else if (i == 1)
{
sum = 1;
}
else
{
sum = Fibonacci(i - 2) + Fibonacci(i - 1);
}
return sum;
}
static void FibonacciTest(int times)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Parallel.For(0, times, (i) => { i.Fibonacci(); });
watch.Stop();
Console.WriteLine("Parallel test:" + watch.ElapsedMilliseconds.ToString());
watch.Restart();
for (int i = 0; i < times; i++)
{
i.Fibonacci();
}
watch.Stop();
Console.WriteLine("test:" + watch.ElapsedMilliseconds.ToString());
}
对以上代码进行40次循环的测试,测试结果如下:
性能的提升还是十分明显的,而且随着循环次数的增加,差距还会进一步拉大。
最后再看看PLINQ的效果。
代码static void PLinqTest()
{
string[] words = new string [] { "c#", "VB", "F#", "Linq", "PLinq", "VJ"};
var p = from c in words.AsParallel()
select c;
Console.WriteLine("PLinq Result:");
foreach (string str in p)
{
Console.Write(str);
Console.Write(" ");
}
Console.WriteLine(" ");
var q = from c in words
select c;
Console.WriteLine("Linq Result:");
foreach (string str in q)
{
Console.Write(str);
Console.Write(" ");
}
Console.WriteLine(" ");
}
测试结果如下:
第一次
第二次
很显然,启用PLINQ后,字符串的显示顺序是随机的,这就是并行计算在起作用。
相关阅读 更多 +