saville

博客园 首页 新随笔 联系 订阅 管理

.NET 4.0增加了不少新特性,并行计算库TPL的引入就是其中之一。TPL不仅大幅提升了并行计算的效率,同时也使得并行计算代码的编写更为简单和方便。最近对此进行了一个小小的测试。

首先进行一下简单计算的测试,实现从1到10000000的累加。

代码
staticvoid 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 会对数据源进行分区,以便循环能够同时对多个部分进行操作,而对数据进行分区势必带来一定的开销,从而导致这类简单计算性能降低。

那就测试一下复杂一点的计算吧,试试斐波那契数列的计算。

代码
staticlong Fibonacci(thisint i)
{
long sum;
if (i ==0)
{
sum
=0;
}
elseif (i ==1)
{
sum
=1;
}
else
{
sum
= Fibonacci(i -2) + Fibonacci(i -1);
}
return sum;
}
代码
staticvoid 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的效果。

代码
staticvoid PLinqTest()
{
string[] words =newstring [] { "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后,字符串的显示顺序是随机的,这就是并行计算在起作用。

 

posted on 2011-02-06 20:21  saville  阅读(603)  评论(0编辑  收藏  举报