zoukankan      html  css  js  c++  java
  • Parallel.ForEach 并行循环的使用

    业务开发,使用foreach遍历几千条数据,并有一定的业务逻辑处理,执行非常耗时,想了一个优化办法就是使用Parallel.ForEach 并行循环:

    正常foreach的写法:

    #region
    //foreach (var InspCategItem in InspCategList)
    //{
    // #region
    // HiddenDangerModelTV hdtvItem = new HiddenDangerModelTV();
    // hdtvItem.text = InspCategItem.Name;
    // hdtvItem.nodeType = (int)nodeTypeEnum.检查类别;
    // hdtvItem.id = InspCategItem.Std_InspectionCategoryID;
    // hdtvItem.hasChildren = true;
    // hdtvItem.expanded = false;
    // hdtvItem.Children = new List<HiddenDangerModelTV>();

    // if (isRiskEvalSubItem)
    // {
    // hdtvItems.Add(hdtvItem);
    // }
    // else
    // {
    // if (isHaveEvalItem == 1)
    // {
    // var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
    // if (isHaveItemList.Contains(hdtvItem.id))
    // {
    // hdtvItems.Add(hdtvItem);
    // }
    // }
    // else if (isHaveEvalItem == 2)
    // {
    // //var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
    // //if (!isHaveItemList.Contains(hdtvItem.id))
    // //{
    // // hdtvItems.Add(hdtvItem);
    // //}
    // }
    // }

    // FindInspItemImport(hdtvItem, itemCheckIdStr, isRiskEvalSubItem, siteGroupId, isHaveEvalItem);
    // if (isHaveEvalItem == 2)
    // {
    // if (hdtvItem.Children.Count > 0)
    // {
    // hdtvItems.Add(hdtvItem);
    // }
    // }
    // #endregion
    //}
    #endregion

    第二种使用并行循环:

    #region
    Parallel.ForEach(InspCategList, InspCategItem =>
    {
    #region
    HiddenDangerModelTV hdtvItem = new HiddenDangerModelTV();
    hdtvItem.text = InspCategItem.Name;
    hdtvItem.nodeType = (int)nodeTypeEnum.检查类别;
    hdtvItem.id = InspCategItem.Std_InspectionCategoryID;
    hdtvItem.hasChildren = true;
    hdtvItem.expanded = false;
    hdtvItem.Children = new List<HiddenDangerModelTV>();

    if (isRiskEvalSubItem)
    {
    hdtvItems.Add(hdtvItem);
    }
    else
    {
    if (isHaveEvalItem == 1)
    {
    var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
    if (isHaveItemList.Contains(hdtvItem.id))
    {
    hdtvItems.Add(hdtvItem);
    }
    }
    else if (isHaveEvalItem == 2)
    {
    //var isHaveItemList = _rplService.GetIsHaveEvalItems(siteGroupId);
    //if (!isHaveItemList.Contains(hdtvItem.id))
    //{
    // hdtvItems.Add(hdtvItem);
    //}
    }
    }

    FindInspItemImport(hdtvItem, itemCheckIdStr, isRiskEvalSubItem, siteGroupId, isHaveEvalItem);
    if (isHaveEvalItem == 2)
    {
    if (hdtvItem.Children.Count > 0)
    {
    hdtvItems.Add(hdtvItem);
    }
    }
    #endregion
    });
    #endregion

    System.Diagnostics.Stopwatch Watch1 = new System.Diagnostics.Stopwatch();
    Watch1.Start();

    中间是上面的两段代码的执行时间统计

    Watch1.Stop();
    var time = Watch1.ElapsedMilliseconds;

    执行得出的结果:只使用foreach需要耗时15秒,使用Parallel.ForEach需要耗时11秒,所以说Parallel.ForEach效率比oreach高

    当然这个执行时间还是比较长,还得需要优化,这个优化就得在方法内部的业务逻辑的代码优化了

  • 相关阅读:
    anaconda安装
    MySQL数据库安装(windows 10 64bit)
    Redis数据库安装(windows 10 64bit)
    MongoDB可视化界面配置
    MongoDB安装(windows 10环境)
    四,程序流程控制之函数
    三,程序流程控制之顺序结构、分支结构与循环结构
    一,Python入门
    关于如何使用Python绘制基本数据图形模型
    关联分析
  • 原文地址:https://www.cnblogs.com/redfull/p/9633659.html
Copyright © 2011-2022 走看看