【问题标题】:How to improve performance of my linq query?如何提高我的 linq 查询的性能?
【发布时间】:2015-07-21 14:11:37
【问题描述】:

我有以下使用 Linq 的代码。

 return (from item in this
          where item.IsMatch(orgid, postcode, shipmentMethod, providerCode)
          orderby item.OrderID
          select item.DTime).FirstOrDefault();

对于 200 万条记录,返回值需要 10 分钟以上。 有人可以帮我如何使用ParallelEnumerable 将此查询转换为一个吗?

欢迎任何其他关于如何优化性能的建议..

*** 上面的示例引用了我从IEnumerable 继承的自定义类。 IsMatch() 方法里面有一些条件:

public bool IsMatch(long orgid, string postcode, string shipmentMethod, string providerCode)
{
    if (string.IsNullOrWhiteSpace(providerCode)) providerCode = null;
    if (string.IsNullOrWhiteSpace(shipmentMethod) || shipmentMethod == "0") shipmentMethod = null;
    return (OrgID == 0 || orgid == OrgID) &&
            PostcodeFrom.Length == postcode.Length &&
            string.CompareOrdinal(PostcodeFrom, postcode) <= 0 &&
            string.CompareOrdinal(PostcodeTo, postcode) >= 0 &&
            (ShipmentMethod == null || shipmentMethod == ShipmentMethod) &&                    (ProviderCode == null || providerCode == ProviderCode);
}

【问题讨论】:

  • 我不认为在这里使用 AsParallel() 会有所帮助。 200 万条记录中有多少通过IsMatch() 过滤器?
  • 马修,我已经更新了问题
  • 如果大多数记录都通过IsMatch() 过滤器,这将非常低效。您实际上不需要对查询结果进行排序,因为您只获取具有最低OrderID 的对象。考虑改用Min()
  • 订单未按OrderID 排序是否有原因?
  • 您是否运行了分析器?遇到性能问题的第一步是分析应用程序并查看发生了什么,然后从那里进行优化。

标签: c# .net performance linq


【解决方案1】:

试试

return this.AsParallel()
    .Where(p=> p.IsMatch(orgid, postcode, shipmentMethod, providerCode))
    .Min(p=> p.OrderID)
    .Select(p=> p.DTime);

正如 dymanoid 提到的,OrderBy 是不必要的。

TPL 应该能够利用 Where()Min() 中的并行性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2013-08-05
    • 1970-01-01
    • 2020-02-12
    • 2016-01-20
    相关资源
    最近更新 更多