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高

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

  • 相关阅读:
    php实现一个简单的四则运算计算器
    linux下service+命令和直接去执行命令的区别,怎么自己建立一个service启动
    mongodb
    随笔一个dom节点绑定事件
    php-fpm 启动参数及重要配置详解
    PHP的设计模式之工厂模式
    linux下mysql数据的导出和导入
    windows下mongodb安装与使用图文教程(整理)
    MySQL性能分析及explain的使用
    nginx反向代理缓存服务器的构建
  • 原文地址:https://www.cnblogs.com/redfull/p/9633659.html
Copyright © 2011-2022 走看看