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高

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

  • 相关阅读:
    20165212第八周学习总结
    20165212第八周课上测试补做
    20165212实验二面向对象程序设计
    Titanic生存预测
    聚类算法数据生成器make_blobs
    k-means
    监督学习、无监督学习与半监督学习
    在线Latex公式编辑器
    西瓜书课后习题——第四章
    ML经典数据集
  • 原文地址:https://www.cnblogs.com/redfull/p/9633659.html
Copyright © 2011-2022 走看看