• .NET 4.0并行计算测试


    .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后,字符串的显示顺序是随机的,这就是并行计算在起作用。

  • 相关阅读:
    Makefile 文件格式
    带你深入理解传递參数
    LeetCode OJ Basic Calculator II
    emacs 为什么找不到运行程序?
    iOS Dev (51)加急审核
    POJ 1159 Palindrome
    9.9递归和动态规划(十二)——小鸡吃米
    c++操作当前窗体句柄
    [Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑
    静态代理模式
  • 原文地址:https://www.cnblogs.com/saville/p/1949524.html
Copyright © 2020-2023  润新知