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

  • 相关阅读:
    数据校验
    Struts2中OGNL
    Struts2 入门(新手必看)
    transactionManager 以及datasource type解析
    MyBatis
    rails 布署
    ubuntu ssh
    ubutun 下配置php和postgresql
    MS SQL 数据库所在C盘变得很大解决办法
    将表里的数据批量生成INSERT语句的存储过程 增强版
  • 原文地址:https://www.cnblogs.com/saville/p/1949524.html
Copyright © 2011-2022 走看看