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

有关对耗时很大循环进行并行化优化的探讨 之一:并发搜索的处理

 
阅读更多

在对程序优化过程中,我们往往对循环体有着刻骨的仇恨,因为它对性能的损耗尤其之大,比如如下例程,是个简单的循环例程,全部执行需要30秒以上(痛苦):

public enum HandleRst
{
完成,
错误_手术刀忘肚子里了,
失败_药物过敏,
失败_家属不签字,
}

public class Obj_Fath
{
private int _SonLen;

public int SonLen
{
get { return _SonLen; }
set { _SonLen = value; }
}

public Obj_Fath(string myt)
{
_T = myt;
_SonObjList = new List<Obj_Son>();
for (int i = 0; i < 1500; i++)
{
Obj_Son p = new Obj_Son(this );
_SonObjList.Add(p);
}
}

public HandleRst DoAsyncHandle()
{
HandleRst rst= HandleRst.完成;

if (_SonObjList.Count > 0)
{
foreach (Obj_Son son in _SonObjList)
{
HandleRst r = ComputeEachSon(son);
if (r != HandleRst.完成)
{
_ThisHandleRst = r;
break;
}
}
}
return rst ;
}

HandleRst ComputeEachSon(Obj_Son sonObj)
{
Thread.Sleep(1);
return sonObj.DoCompute();
}
}

public class Obj_Son
{
Obj_Fath _ObjFath;
public Obj_Son(Obj_Fath fathObj)
{
_ObjFath = fathObj;
}

public HandleRst DoCompute()
{
int len=0;
lock (_ObjFath )
{
_ObjFath.SonLen++;
len =_ObjFath .SonLen ;
}

Thread.Sleep (1);

if (len >1300)
{
return HandleRst.失败_家属不签字;
}
return HandleRst.完成;
}
}

但如何优化它呢,我们很容易想到要对循环体进行并发执行,即


foreach (Obj_Son son in _SonObjList)
{
Thread t =new Thread(ParameterThreadStart(ThreadCompute));
t.Start(son);
}
但这里带来了几个问题:
1) 如何获得ComputeEachSon方法的结果?
2) 如何在返回不为“完成”时立即退出循环?
貌似使用简单的多线程并发无法解决这个问题。

于是,我们想到了采用异步方法,改进后,执行的时间缩减到了6秒,效果还是不错的,附上简单的异步处理代码供大家研究改进。
bool _Tok;
ManualResetEvent _FinEvent;
private HandleRst _ThisHandleRst;
private int _HandleCount;

public HandleRst DoAsyncHandle()
{
_ThisHandleRst = HandleRst.完成;

_FinEvent = new ManualResetEvent(false);
_HandleCount = 0;

if (_SonObjList.Count > 0)
{
foreach (Obj_Son son in _SonObjList)
{
if (_Tok)
break;
HasSonComputingHandler h = new HasSonComputingHandler(ComputeEachSon);
HandleRst r = HandleRst.完成;
AsyncCallback t = new AsyncCallback(HandleCallBack);
h.BeginInvoke(son, t, h);
}
_FinEvent.WaitOne();
}
return _ThisHandleRst ;
}


void HandleCallBack(IAsyncResult iR)
{
if (_Tok)
return;

HasSonComputingHandler u = (HasSonComputingHandler)iR.AsyncState;
HandleRst r = u.EndInvoke(iR);
lock (this)
{
if (r != HandleRst.完成)
{
_ThisHandleRst = r;
_FinEvent.Set();
_Tok = true;
}

_HandleCount++;
if (_HandleCount == _SonObjList.Count)
{
_ThisHandleRst = r;
_FinEvent.Set();
_Tok = true;
}
}
}

试了一下异步操作循环体,发现了一个有趣的现象:
执行
Obj_Fath t = new Obj_Fath("hello");

HandleRst u= t.DoAsyncHandle();
MessageBox.Show("\n计数HandleCount:" +t.HandleCount .ToString ()+"\n计数Sonlen:"+t.SonLen .ToString () +"\n" );

发现 HandeCount值在1298~1302之间
SonLen值在1306~1312之间。
如果顺序执行循环体,程序是在1300次循环时退出, 这说明
1)程序注册了2500个异步委托后,就直接进入阻塞等待状态。
2)完成退出当前方法后,未执行的异步委托会自动取消委托。
这样的话比起线程来说,就有很多好处了,因为发出线程是很难取消的。

更多请看

有关对耗时很大循环进行并行化优化的探讨之二:多重循环任务的并发处理 .

分享到:
评论

相关推荐

    TBB并发容器 学习笔记

    例如,上述代码展示了如何使用`parallel_for`和`blocked_range`来并行处理一个简单的任务,模拟了耗时操作并在双核CPU上实现了近乎两倍的加速。 总的来说,TBB通过提供一系列高级并行算法和线程安全的容器,简化了...

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

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

    并行化遗传算法研究

    由于标准遗传算法在处理大规模问题时面临计算量庞大、执行效率低下的挑战,因此,通过并行计算的方式可以有效解决这些问题。并行遗传算法不仅利用了遗传算法本身的内在并行特性,还进一步探索了更加高效的并行计算...

    并发和并行以及他们的区别

    并行计算可以显著提升计算速度,尤其是在处理大量数据时,通过任务分解和并行化,可以将原本耗时的任务分割成多个小任务并同时执行,从而减少总体处理时间。在Java中,可以使用Java的并发库,如Fork/Join框架和...

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

    通过实验,作者展示了应用程序在进行并行化处理前后性能的对比,证明了多核并行化改造带来的显著性能提升,并对其他开发者进行类似优化提供了有益的参考。 综上所述,Linux应用程序多核并行化方法研究与实现不仅...

    Java秒杀系统方案优化 高性能高并发实战

    本文将围绕“Java秒杀系统方案优化与高性能高并发实战”这一主题,深入探讨相关的技术和策略。 #### 一、秒杀系统的挑战与需求分析 1. **高并发处理能力**:秒杀活动通常会在短时间内吸引大量用户访问,这就要求...

    Weblogic提高并发处理性能的设置

    在现代企业级应用环境中,提高Weblogic服务器的并发处理能力是一项重要的优化措施。本文将详细介绍通过调整Weblogic线程数、设置JDBC缓冲池以及修改`startWeblogic.cmd`文件来实现这一目标的方法。 #### 1. 设置...

    基于大数据的并行化深度卷积神经网络优化算法.zip

    在处理大数据集时,由于网络结构复杂,计算量巨大,传统的单机单核计算方式往往效率低下,耗时较长。因此,基于大数据的并行化深度卷积神经网络优化算法显得尤为重要。 首先,我们需要理解“大数据”在这个语境中的...

    高斯消去法SSE并行化

    通常,这涉及到数据的预处理,如对矩阵进行重排,以便更有效地利用SSE的并行处理能力。同时,需要注意避免数据依赖和流水线冲突,确保并行计算的正确性和效率。 LU分解是高斯消去法的一种优化形式,它将高斯消去法...

    SIFT算法GPU并行化研究.pdf

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

    基于深度学习的多声源并行化声纹辨别方法.pdf

    3. 使用CUDA平台对DBN的训练过程进行了并行优化,缩短了数据训练耗时。 本文的结果表明,基于深度学习的多声源并行化声纹辨别方法可以有效提高声纹辨别准确率和系统实时性,为大数据环境下语音信号高性能处理提供了...

    卷积神经网络的并行化研究

    串行实现的CNN算法有两个显著的缺点:一是无法有效利用算法内部的并行性,导致训练过程耗时较长;二是伸缩性不强,意味着在面对大规模数据集时无法高效地进行处理。针对这些问题,研究者们提出了基于MapReduce框架和...

    IIS日志分析工具(按访问页面统计并发数量和耗时)

    【IIS日志分析工具】是一款基于ASP.NET技术开发的应用,专门用于对IIS服务器的日志数据进行深度分析。在互联网服务中,IIS(Internet Information Services)是微软提供的一个强大的Web服务器,它记录了服务器上的...

    大数据量高并发的数据库优化

    在IT领域,尤其是在数据库管理与优化方面,“大数据量高并发的数据库优化”是一个至关重要的议题。随着数据量的爆炸性增长以及用户需求的多样化,如何有效地处理海量数据并确保系统的稳定性和响应速度,成为了现代...

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

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

    Web系统大规模并发

    本文将探讨大规模并发情况下Web系统面临的挑战及其解决方案,并通过具体案例分析如何保障系统的稳定性与性能。 #### 一、大规模并发带来的挑战 1. **请求接口的合理设计** 秒杀或抢购页面通常包含两部分:静态...

    8天玩转并行开发(C#并发)

    它可以自动将循环体分配给不同的线程进行并行处理。 **示例代码**: ```csharp using System; using System.Collections.Concurrent; using System.Diagnostics; class Program { static void Main() { for ...

    Auto Parallel:自动化分布式并行训练-华为苏腾.pdf

    华为在人工智能领域继续领先,Auto Parallel技术是一项创新的分布式并行训练方案,它能够自动化处理模型并行和数据并行的难题,提高了大规模神经网络模型的训练效率。该技术在华为全联接大会上首次亮相,旨在解决在...

Global site tag (gtag.js) - Google Analytics