`
窗户纸
  • 浏览: 19459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

有关对耗时很大循环进行并行化优化的探讨之三:并行线程越多运行就会越快吗?

 
阅读更多


在.net framework4.0以后,出现了并行编程的概念,使用 Parallel.For(0, N, i =>{ ... },很容易就可以实现我们自定义的并行化循环操作,在并行循环体中,还可以操作外部的变量,这个特性是很多其他语言所没有的,当然其他语言,诸如JAVA之类,完全可以采用我们在第二篇所介绍的方法自己生成并行化操作。

由于.net framework使用环境的局限性,以及“庞大的身躯”,和安装时必须向微软“报到”的限制。很多开发商并不喜欢用,完全可以采用我所介绍的方式实现并行化,与微软的并行化的区别只是他的循环体是使用了lamda表达式,而我的方式是使用委托而已。再发散一下,我个人认为微软的并行化操作在并行化优化方面,多处理器利用方面会更有优势些,性能会更好。

但.Net FrameWork中对并行化并行化的最大线程数貌似并没有进行个性化限定,运行起来自然是并行任务能开多少开多少了。就并行线程数的问题,我们在某个项目中做了一个实验,具体的并行任务中既有数据库操作,又有通信操作,还包括了若干锁定资源操作,以下就是实验结果敲打

最大线程数

程序平均执行时间

单线程

31470 ms

15线程

20042 ms

5线程

20307 ms

3线程

18745 ms

2线程

18523 ms


从这个有趣的实验结果可以看出,某些应用下,似乎线程数越多,执行时间反而越慢了, 很多情况下,并行化的程序性能可能反而不如顺序执行,甚至会出现一些死锁等问题,这在微软的说明中提到了很多(见http://technet.microsoft.com/zh-cn/magazine/dd997392(VS.110).aspx),从这篇文章,我们可以看到,影响性能的因素主要有两大类:
1. 对共享资源的锁定问题:这个问题比较好理解,如果多个并行任务尝试操作被锁定的内存位置,那么后来的肯定要等待,对于考虑不很周到的代码,其结果就是比串行机制还慢.
2. 循环体内的对象运行机制问题
在微软的说明中,提到了“不安全的对象”并行化的问题,比如filestream, ui对象等,

另一个有趣的操作是数据库操作及通信操作, 其特征是自身就具有不可控的性能瓶颈,最好通过优化数据库的命令,如连表查询、存储过程等处理。
但对于懒人,或者不需要再精细优化的情况下,并行任务占据的线程数越少,对整体资源及其他任务的影响也越少,所以我们可以对已经封装的并行化类进行一下最大线程数的限制:

   class ParaLoop
    {
         ....
        private int _MaxThreadQty;

        private int _CurrentThreadQty;
        private ManualResetEvent ReqThreadEvent = new ManualResetEvent(false);
        private object _SynthreadQty = new object();

        public ParaLoop(int mtq)
        {
            _MaxThreadQty = mtq;
        }

        private void ReleaseThread()   //使用完后释放线程,并通知可以申请新线程
        {
            lock (_SynthreadQty )
            {
                _CurrentThreadQty--;
                ReqThreadEvent.Set();
            }
        }


         ~ParaLoop()
        {
            ReqThreadEvent.Set();
        }
 
        private MyParaThread RequestThread()   // 申请线程,如果达到最大数则等待,直到有新的线程可用
        {
            lock (_SynthreadQty)
            {
                if (_CurrentThreadQty < _MaxThreadQty)
                {
                    _CurrentThreadQty++;
                    return new MyParaThread();
                }
                else
                {
                    ReqThreadEvent.Reset();
                }
            }

            ReqThreadEvent.WaitOne();

            lock (_SynthreadQty)
            {
                _CurrentThreadQty++;
                return new MyParaThread();
            }            
        }

       public object ParaCompute(MyParaLoopTaskHandler loopTask, object[] inArg, int loopQty)
        {
            ...

            for (int i = 0; i < _TotalQty; i++)
            {
                MyParaThread u = RequestThread();  //由直接新建线程改为申请线程
             //   MyParaThread u = new MyParaThread();
                
            }
            _ParaEvent.WaitOne();

            return _ParaLoop_Return;
        }
  

       void u_EndTaskCallBack(bool taskRst, object retVal)
        {
           ... 

            ReleaseThread();   //有返回值表示可以释放线程了
         }
    }

 

}



分享到:
评论

相关推荐

    Linux应用程序多核并行化方法研究与实现

    在此基础上,使用Intel的线程构建块(TBB)库实现了并行化的编程,并且在调试和优化过程中利用Intel Thread Checker来发现潜在的多线程错误。研究成果显示,经过并行化改造的应用程序性能有显著提升,这对于其他多核...

    12.1 Qt5多线程:多线程及简单实例

    Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作而变得卡顿。本知识点将深入探讨Qt5中的多线程以及一个简单的实例——WorkThread。 **1. ...

    yolov5目标检测多线程C++部署

    本文将深入探讨如何使用C++实现YOLOv5的多线程部署,以提升程序运行效率。 首先,YOLOv5的多线程部署涉及到C++编程语言的基础知识,包括类、函数、指针以及内存管理等。C++是一种静态类型的语言,允许低级内存操作...

    浅谈.NET下的多线程和并行计算.pdf

    - **优化算法设计**:选择适合并行化的算法,比如MapReduce等分布式计算模型。 #### 六、结论 综上所述,多线程与并行计算已经成为现代软件开发的重要组成部分,尤其是在.NET框架中。通过理解和掌握这些技术,开发...

    具有量子行为粒子群优化算法的并行化研究.pdf

    【并行化研究】针对大规模优化问题,传统的单线程优化算法往往计算耗时较长。并行化是解决这一问题的有效手段,通过将计算任务分解到多个处理器或计算节点上同时执行,大幅提高了计算效率。在量子行为粒子群优化算法...

    R语言并行计算实战_R语言并行计算_

    例如,当需要对一个大向量执行相同的操作,如计算每个元素的平方,传统方法会逐个进行,耗时较长。而在并行计算环境中,可以将向量分割成多个部分,每部分在一个核心上独立计算,最后合并结果。这种方式大大提高了...

    异步多线程Demo

    在IT领域,多线程是程序设计中的一个重要概念,尤其在高性能和响应迅速的应用中,如服务器端编程、游戏开发和大规模数据处理等。多线程允许程序同时执行多个独立的任务,提高系统的并发性和资源利用率。这个“异步多...

    FileCopy1.rar_多文件复制_多线程复制

    本文将深入探讨“FileCopy1.rar”压缩包中所包含的“多文件复制_多线程复制”这一主题。 首先,让我们理解什么是多文件复制。在日常操作中,我们经常需要复制多个文件或整个目录结构,这可能包括数千个文件。传统的...

    SIFT算法GPU并行化研究.pdf

    本文还对 SIFT 算法的并行化实现进行了讨论,包括使用 CUDA 实现 SIFT 算法的并行化、使用 OpenCL 实现 SIFT 算法的并行化、使用 MPI 实现 SIFT 算法的并行化等。这些方法可以提高 SIFT 算法的计算速度,提高图像...

    delphi多线程技术

    - 充分利用多核CPU:在多处理器系统中,不同线程可以在不同CPU核心上并行运行,提高计算效率。 - 可调整优先级:线程具有优先级,允许调整工作进度。 2. 缺点: - 复杂性增加:多线程可能导致代码结构复杂,难以...

    OC多线程管理

    本知识点将深入探讨OC多线程的基本概念、主要实现方式以及实际应用。 一、基本概念 1. 主线程:应用程序的入口,负责更新UI和处理用户交互,必须保持流畅。 2. 工作线程:用于执行非UI相关的后台任务,避免阻塞主线...

    C语言的并行魔法:多线程编程实现指南

    本文将深入探讨如何在C语言中实现多线程编程,并结合POSIX线程库(pthread)进行详细讲解。 #### 多线程编程的重要性和优势 1. **提高程序性能**:多线程能够利用多核处理器的优势,让程序能够在多个核心上并行...

    各种并行排序算法的C语言实现代码

    并行排序是计算机科学中的一种优化策略,它利用多处理器或多核心系统的优势,将排序任务分解为多个子任务,同时进行处理,以提高整体效率。C语言作为一种强大的系统级编程语言,非常适合实现并行计算算法。本文将...

    多线程(概述)

    视频文件"01-多线程(概述).avi"很可能涵盖了多线程的基础概念、创建线程的方法以及如何处理线程间的同步问题等内容,是学习多线程编程的好材料。通过观看这个视频,你可以更深入地理解多线程的工作原理,掌握如何在...

    使用多线程进行文件搜索

    在这个“使用多线程进行文件搜索”的主题中,我们将深入探讨如何利用多线程来优化文件搜索操作,特别是在VC++6.0环境下。 1. **多线程的基本概念** - 线程是操作系统中的一个执行单元,每个线程都拥有自己的执行上...

    基于LabVIEW 测试系统的多线程编程模拟

    ### 基于LabVIEW测试系统的多线程编程模拟 #### 引言 在现代测试系统开发中,提高系统的实时性和效率是至关重要的。传统的单线程编程模型往往难以满足这些需求,尤其是在处理复杂的测试任务时。为了克服这一挑战,...

    多线程编程指南

    多线程编程是指在单个程序中同时运行多个线程的技术,它允许程序在多个CPU核心或处理器上并行执行任务,从而提高程序的执行效率和响应速度。在多线程编程中,线程是最小的可调度单元,它共享同一进程的资源,如内存...

    linux多线程编程

    2. **优化多CPU系统**:在多处理器环境中,多线程能充分利用硬件资源,显著提升程序运行效率。 3. **改进程序结构**:多线程有助于构建模块化、可扩展的软件架构,增强代码的可读性和可维护性。 4. **节约系统资源**...

Global site tag (gtag.js) - Google Analytics