【问题标题】:c# Performance Issue while creating Multiple objectsc# 创建多个对象时的性能问题
【发布时间】:2018-02-08 18:52:46
【问题描述】:

在我们的代码中,我们将域实体映射到 API DTO 对象。在转换实体的过程中返回了大量的记录。当我们尝试将这些记录映射到 DTO 时,会花费大量时间。 这是一个例子

  Class test
{
    public virtual int ID { get; protected internal set; }
    public virtual Employee Employee { get; protected internal set; }
    public virtual BusinessDate Start { get; protected internal set; }
    protected internal virtual IList<ABC> _abc { get; set; }
    public virtual IEnumerable<ABC>  ABCRange{
  get
  {
    return _abc;
  }
}

 public IEnumerable<test> GetByEmployees(IEnumerable<int> employees)
    {
      return ChunkIDsQueryForSQLServer2100Limit(employees, empArray =>
              (from ar in GetAllAsQueryable()
              where empArray.Contains(ar.Employee.ID)
              select ar).ToList());
    }
class ABC
{
    public virtual int ID { get; protected internal set; }
    public virtual int DayOfWeek { get; protected internal set; }
    public virtual bool StartTimeOffset { get; protected internal set; }
    public virtual bool EndTimeOffset { get; protected internal set; }
    public virtual AvailabilityType Type { get; protected internal set; }

}

DTO Mapper:

    return new AvailabilityRequestCollectionResource
      {
        AvailabilityRequests = availabilityRequest.Select(AvailabilityRequestMap).ToList()
      };

     private static TEST2 AvailabilityRequestMap(TEST test)
    {
       var availabilityRequestResource = new TEST2
      {
        ID = availabilityRequest.ID,
        EmployeeID = availabilityRequest.Employee.ID,
        GeneralAvailability = AvailabilityTypeMap(availabilityRequest.ABCRange.Where(f => f.Type == AvailabilityType.General)),
        PreferredAvailability = AvailabilityTypeMap(availabilityRequest.ABCRange.Where(f => f.Type == AvailabilityType.Preferred))
      };
    }

    private static List<XYZ> AvailabilityTypeMap(IEnumerable<ABC> abc)
    {
      var availList = new List<XYZ>();

      availList.AddRange(abc.Select(x =>
        new XYZ
        {
          ID = x.ID,
          DayOfWeek = (Day)x.DayOfWeek,
          StartTimeOffset = x.StartTimeOffset,
          EndTimeOffset = x.EndTimeOffset,
          WeekNumber = 1
        }
      ));
      return availList;
    }

现在的问题是上述方法需要将近 15 秒才能创建 10k 个 XYZ 对象。我们的性能瓶颈是 2 秒,并且每次都没有。的对象可能会有所不同。怎么做? 我们尝试了并行性和任务分配,但这些都没有帮助,因为从域中进行了延迟加载,我们无法修改。

注意:ABC 和 XYZ 的属性集不同

谢谢

【问题讨论】:

  • 你能分享你如何得到你的IEnumerable&lt;ABC&gt;(你可能是从一些DbContext或其他东西加载它),并显示你的ABC类的定义。
  • 我们有一个由存储库方法加载的域实体类。公共虚拟 IEnumerable abc { 获取 { 返回 _abc; } } 受保护的内部虚拟 IList _availabilityRanges { get;放; } public IEnumerable GetByEmployees(IEnumerable employees) { return ChunkIDsQueryForSQLServer2100Limit(employees, empArray => (from ar in GetAllAsQueryable() where empArray.Contains(ar.Employee.ID) select ar).ToList()); } 是存储库调用
  • 添加了实际代码

标签: c# .net performance


【解决方案1】:

从域延迟加载已经到位

这是几乎可以肯定 100% 的瓶颈。

我们无法修改

那你就修不了了。

您需要挑战延迟加载,或采取措施以有效先发制人地加载该数据(即不是按项目 - n+1 是残酷的)。

创建 10k 个对象并从存在的值中填充它们 应该几乎是瞬时的(只要实现不做任何愚蠢的事情)。这不是问题所在,盯着执行此操作的代码:无济于事。

【讨论】:

  • 对于不熟悉延迟加载的开发人员来说,这是一个非常常见的问题。 OP 应该急切加载相关实体,如果他们共享真实代码,则很可能是dept 属性。
  • @vijay 好吧,是的; AvailabilityRequestMap 太可怕了,会让你瘫痪;如果你无法改变:你无法解决问题。
  • @Marc Gravell 需要您的输入,我想测试有两个 的 TEST2 类,一个用于通用,一个用于首选。我不是来自 c# 背景。你能指导我如何做到这一点吗?
  • @vijay 我什至不明白你在问什么,所以我无法发表评论;它与您上面遇到的问题有关吗?如果是这样:如何?
  • 当你说“AvailabilityRequestMap 太可怕了,会削弱你”。我不确定我应该在那里做什么样的改变。您能指导我进行这些更改吗?
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多