zoukankan      html  css  js  c++  java
  • Parallel并行编程初步

    Parallel并行编程可以让我们使用极致的使用CPU。并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片。而并行编程则是多CPU核心同时工作。耗时的CPU计算操作选择并行是明智的。通常情况,每个CPU核心代表一个硬件线程,但超线程技术,可以使一个cpu核心具有两个硬件线程。软件线程顾名思义就是我们在程序中所开启的。

    下面看一个最基础的并行编程的例子,也足以体现多核心并行运行的好处,当然微软.NET为我们封装后,我们也不必过多关注底层操作,那我们就看一下运行结果。

    static void Main(string[] args)
            {
                #region   实验1
    
                var watch = Stopwatch.StartNew();
    
                watch.Start();
    
                FirstOption();
    
                SecondOption();
    
                Console.WriteLine("串行编程耗时:{0}", watch.ElapsedMilliseconds);
    
    
    
                watch.Restart();
    
                Parallel.Invoke(FirstOption, SecondOption);
    
                watch.Stop();
    
                Console.WriteLine("并行编程耗时:{0}", watch.ElapsedMilliseconds);
    
                Console.Read();
            }
    
            static void FirstOption()
            {
                //假装CPU耗时操作
                Console.WriteLine("我在时间{0}开始",DateTime.Now);
                Thread.Sleep(3000);
                Console.WriteLine("我是任务一,耗时3s");
                
            }
    
            static void SecondOption()
            {
                //假装CPU耗时操作
                Console.WriteLine("我在时间{0}开始", DateTime.Now);
                Thread.Sleep(5000);
                Console.WriteLine("我是任务二,耗时5s");
                
            }

    看完结果,相信不用我说,你也明白了,并行操作由多核心同时操作。

    可能你会问如果我需要执行十几个类似于示例中的Option方法怎么办,那就要看你的核心数量了,如果核心数量不足,并不是所有的操作都是同一秒进行的。

    代码就不上了,就是弄了11个option,可以看出我的配置很菜,有些时候同一秒开启只两个option,原因就是另外的option耗时比较长,在占用状态。

    下面将介绍Parallel的For循环。并限制其能使用的硬件线程个数。

    代码如下:

    
    
     var bag = new ConcurrentBag<int>();
                GC.Collect();
                watch.Start();
    
                ParallelOptions options = new ParallelOptions();
    
                //设置硬件线程数
                options.MaxDegreeOfParallelism = 1;
                //options.MaxDegreeOfParallelism = 2;  
    //options.MaxDegreeOfParallelism = 3;
    //options.MaxDegreeOfParallelism = 4; Parallel.For(0, 20000000, options, i => { bag.Add(i); }); //for (int i = 0; i < 20000000; i++) //{ // bag.Add(i); //} watch.Stop(); Console.WriteLine("并行计算:集合有:{0},使用的时间:{1}", bag.Count, watch.ElapsedMilliseconds); Console.ReadKey();
    
    
    
    
    

    我分别使用1,2,3个硬件线程数和4个硬件线程数作比较。效果很明显!

    关于Parallel的For循环,实际上和我们普通的串行编程功能一样,只不过在并行编程中,.NET底层帮助我们大限度的使用了CPU而已。如果你不限制硬件线程数,通常会尽最大可能使用资源。

    同时我也测试了串行代码。

    另外受环境影响,并行的优势并非绝对。

    2016.10.07补充。

    在服务器应用上,通常也就是我们的web应用,很多时候使用并行编程会降低你的处理性能,也许在你的用户特别少的情况下会有些作用。

    并行编程主要应该是用在桌面应用这种,让用户的机器完全利用起来。

  • 相关阅读:
    广州公交百态之座位
    遍地大头者,岂尽聪明人
    小和尚
    c++中调用其他应用程序的方法(winexec shellexecute createprocess)
    MFC Is MVC
    Dialog Data Exchange
    MFC Extension dll VS Regular Dll
    Don't optimize prematurely
    Menu Basic
    Don't pessimize prematurely
  • 原文地址:https://www.cnblogs.com/tdws/p/5735130.html
Copyright © 2011-2022 走看看