• C#并行


           /// <summary>
            ///该实现方式并不是最高效的
            ///只是举个例子,说明用锁来保护共享状态
            /// </summary>
            /// <param name="values"></param>
            /// <returns></returns>
            static int ParallelSum(IEnumerable<int> values)
            {
                object mutex = new object();
                int result = 0;
                Parallel.ForEach(
                    source: values,
                    localInit: () => 0,
                    body: (item, state, localValue) => localValue + item,
                    localFinally: lovalValue =>
                    {
                        lock (mutex)
                        result += lovalValue;
                    }
                    );
                return result;
            }

       static int ParallelSum2(IEnumerable<int> values)
            {
                return values.AsParallel().Aggregate(seed: 0, func: (sum, item) => sum + item);
            }
     
     
            static int ParallelSum1(IEnumerable<int> values)
            {
                return values.AsParallel().Sum();
            }
    

        static void Main(string[] args)
            {
     
     
                for (int i = 0; i < 10; i++)
                {
                    int[] nums = { 1, 23, 12, 31, 23, 12, 312, 3, 123, 12, 3 };
                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                    Console.WriteLine("ParallelSum:" + ParallelSum(nums));
                    sw.Stop();
                    TimeSpan ts = sw.Elapsed;
                    Console.WriteLine(ts.TotalMilliseconds);
     
                    Stopwatch sw1 = new Stopwatch();
                    sw1.Start();
                    Console.WriteLine("ParallelSum1:" + ParallelSum1(nums));
                    sw1.Stop();
                    TimeSpan ts1 = sw1.Elapsed;
                    Console.WriteLine(ts1.TotalMilliseconds);
     
                    Stopwatch sw2 = new Stopwatch();
                    sw2.Start();
                    Console.WriteLine("ParallelSum2:" + ParallelSum2(nums));
                    sw2.Stop();
                    TimeSpan ts2 = sw2.Elapsed;
                    Console.WriteLine(ts2.TotalMilliseconds);
     
                }
            }


          

    
    

        总结:

         第一次运行:ParallelSum2 比 ParallelSum1 ParallelSum 快几倍左右

         第二次开始:ParallelSum2总体比ParallelSum1 ParallelSum快

         所以运用Aggregate()聚合功能 good

    好好学习,天天向上。
  • 相关阅读:
    设计模式享元模式实现C++
    并查集
    设计模式代理模式实现C++
    设计模式装饰模式实现C++
    最小生成树Prim算法实现
    图的邻接矩阵存储
    威佐夫博弈(Wythoff Game)初识 HDU 1527 POJ 1067
    设计模式原型模式实现C++
    三种经典博弈问题 BashGame;WythoffGame;NimmGame;
    设计模式外观模式实现C++
  • 原文地址:https://www.cnblogs.com/Zhengxue/p/6141592.html
Copyright © 2020-2023  润新知