我该如何优化这些循环

时间:2018-02-23 17:31:36

标签: c# parallel.foreach

我有下面的代码片段,随着数据的增加需要很长时间才能运行。

OrderEntityColection是List,samplePriceList是List

OrderEntityColection = 30k交易 samplePriceList = 1百万价格

轻松完成10-15分钟或更长时间

我已经用1500个订单和30万个价格测试了这个,但它也需要大约40-50秒,而且订单增加所以价格甚至需要更长时间

你能看到我如何改善这一点。我已经把它从一个大集合中切割成了这些数字。

MarketId = int Audit = string

foreach (var tradeEntity in OrderEntityColection)
{
    Parallel.ForEach(samplePriceList,new ParallelOptions {MaxDegreeOfParallelism = 8}, (price) =>
    {
          if (price.MarketId == tradeEntity.MarketId)
          {
              if (tradeEntity.InstructionPriceAuditId == price.Audit)
              {
                    // OrderExportColection.Enqueue(tradeEntity);
                    count++;
              }
          }

     });
}

2 个答案:

答案 0 :(得分:0)

在并行循环中,您可以跳过某些项目的处理。这是相当昂贵的,因为你依靠该检查也发生在一个单独的线程上。我只是在处理结果之前先过滤掉结果,如下所示:

foreach (var tradeEntity in OrderEntityColection)
{
    Parallel.ForEach(samplePriceList.Where(item=>item.MarketId == tradeEntity.MarketId && item.Audit == tradeEntity.InstructionPriceAuditId) ,new ParallelOptions {MaxDegreeOfParallelism = 8}, (price) =>
    {
         // Do whatever processing is required here
        Interlocked.Increment(ref count);
    });
}

在旁注中,您似乎需要将count++替换为Interlocked.Increment(ref count),以确保线程安全。

答案 1 :(得分:0)

在朋友的帮助下进行管理

var samplePriceList = PriceCollection.GroupBy(priceEntity=> priceEntity.MarketId).ToDictionary(g=> g.Key,g=> g.ToList());


        foreach (var tradeEntity in OrderEntityColection)
        {
            var price = samplePriceList[tradeEntity.MarketId].FirstOrDefault(obj => obj.Audit == tradeEntity.Audit);
            if (price != null)
            {
                count+=1;
            }
        }