.NET 4.0并行计算测试

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

首先进行一下简单计算的测试,实现从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());
}

 测试结果如下:

.NET 4.0并行计算测试

不是吧?并行计算效果怎么还不如普通的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(
" " );
}

测试结果如下:

第一次

.NET 4.0并行计算测试

第二次

很显然,启用PLINQ后,字符串的显示顺序是随机的,这就是并行计算在起作用。

 

你可能感兴趣的:(.net)