【问题标题】:Increase c# list performance提高 c# 列表性能
【发布时间】:2016-11-09 03:18:41
【问题描述】:

我有一个包含 20 个字段的 C# 类,我正在循环遍历 List "A"(类对象列表)并将 List "A" 中的所有值添加到 List "B"(类对象列表)。在任何给定时间,列表“A”中值的最大数量都不会超过 160 条记录。

我需要 25 秒才能完成操作(循环通过列表“A”并将它们添加到列表“B”)

我尝试将列表更改为HashSet,并将执行时间减少到 19 秒。我能做些什么来显着提高性能,即将它降低到 2-3 秒。有什么建议吗?

var products = new List<ProductDto>();
using (var _userEntities = new UserEntities())
{
    UserDto user = GetUserDto(userEmail, _userEntities);
    if (user != null)
    {
        var users = _userEntities.Where(x.User.userId == user.Id);
        foreach (User user in users)
        {
            if (_userEntities.Products.FirstOrDefault(y => y.userId == user.Id) != null)
            {
                var Product = new ProductDto()
                {
                    Id = user.Id.ToString(),
                    ProductId = user.Product != null ? user.ProductId : string.Empty,   
                    Name = user.Product != null ? user.Product.Name : string.Empty,
                    SalePrice = user.SalePrice == null ? string.Empty : user.SalePrice.ToString(),
                    OrderId = user.OrderID,
                    CreatedDate = user.CreatedDate,
                    HasChildItems = user.Product != null && user.Product.HasChildItems != null && user.Product.HasChildItems ? true : false,
                    OrderNumber = user.OrderNumber,

                };

                products.Add(Product);
            }
        }
    }
}

【问题讨论】:

  • 所以你只是在做listB.AddRange(listA);?
  • 这个操作完全没有理由花费这么长时间。问题不在于列表本身,而在于您正在使用它做什么。请发布您的相关代码。
  • 如果能提供一些代码就好了。
  • @DavidL 添加了代码
  • 正是我所怀疑的。您在这里有一个经典的 select n+1 查询。问题不在于清单。这是您正在生成的 sql 查询的数量。

标签: c# list performance-testing


【解决方案1】:

问题不在于列表的长度,而在于 SQL 查询的数量。如果您有 160 个元素,则列表 161 sql 语句在您的情况下似乎非常慢(使用分析器进行分析)。您可以尝试修改您的 linq 查询以将所需产品与用户连接。我不知道你的数据模型,但它可能是这样的:

var users = from u in dbContext.Users.Include(u => u.Product);

var products = from p in dbContext.Products.Include(p => p.User);

渴望加载而不是延迟加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    相关资源
    最近更新 更多