zoukankan      html  css  js  c++  java
  • .NET中的简单的并行循环Parallel.For和Parallel.ForEach

    这里简单的介绍一下.net中的任务并行库。简单的并行循环Parallel.For和Parallel.ForEach。我们常见的for和foreach循环分别对应并行循环Parallel.For和Parallel.ForEach。

    参考文档:https://msdn.microsoft.com/zh-cn/library/system.threading.tasks.parallel_methods(v=vs.110).aspx

    对比for循环和Parallel.For的性能

            static void Main(string[] args)
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                int[] nums=new int[100];
                for (int j = 0; j < 100; j++)
                {
                    nums[j] = j * 100000 + j;
                }
                Debug.WriteLine(string.Format("循环开始:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
                for (int i = 0; i < nums.Length; i++)
                {
                    LoopRun(nums[i]);
                }
                //Parallel.For(0, nums.Length, i=>LoopRun(nums[i]));
                Debug.WriteLine(string.Format("循环结束:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
                Console.ReadKey(); //暂停
            }
            static void LoopRun(int num)
            {
                for (int i = 0; i < num; i++)
                {
                    if (i == num - 1)
                        ;//Debug.WriteLine("循环" + num);
                }
            }

    执行代码,得到使用for循环从0到100的执行时间为:1845ms

    循环开始:   0ms
    循环结束:1,845ms

    取消Parallel.For的注释代码,注释for循环,看看Parallel.For的执行时间为494ms

    循环开始:   0ms
    循环结束: 494ms
    可以看到这个并行执行的效率是非常高的

    对比foreach循环和Parallel.ForEach

            static void Main(string[] args)
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                int[] nums = new int[100];
                for (int j = 0; j < 100; j++)
                {
                    nums[j] = j * 100000 + j;
                }
                Debug.WriteLine(string.Format("循环开始:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
                foreach (var item in nums)
                {
                    LoopRun(item);
                }
                //Parallel.ForEach(nums, i => LoopRun(i));
                Debug.WriteLine(string.Format("循环结束:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
                Console.ReadKey(); //暂停
            }
            static void LoopRun(int num)
            {
                for (int i = 0; i < num; i++)
                {
                    if (i == num - 1)
                        ;//Debug.WriteLine("循环" + num);
                }
            }
    执行代码,得到使用foreach循环从0到100的执行时间为:1832ms
    循环开始:   0ms
    循环结束:1,832ms

    取消Parallel.ForEach的注释代码,注释foreach循环,看看Parallel.ForEach的执行时间为394ms

    循环开始:   0ms
    循环结束: 394ms
    可以看到这个并行执行的效率是非常高的,貌似比for循环和Parallel.For都要高


  • 相关阅读:
    查找质数的算法优化版
    一些新闻链接
    spring的自动装配基础
    Spring中的Autowired注解和Resource注解的区别
    动态规划:01背包 复习
    贪心问题 POJ 2393 Yogurt factory
    穷竭搜索:POJ 3187 Backward Digit Sums
    穷竭搜索: POJ 2718 Smallest Difference
    何凯文每日一句打卡||DAY1~DAY3
    贪心问题:区间覆盖 POJ 1328 Rader Installation
  • 原文地址:https://www.cnblogs.com/hueychan/p/10575907.html
Copyright © 2011-2022 走看看