c#创建多个对象时的性能问题

时间:2018-02-08 10:15:44

标签: c# .net performance

在我们的代码中,我们将域实体映射到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没有相同的属性集

由于

1 个答案:

答案 0 :(得分:1)

  

来自域的延迟加载

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

  

我们无法修改

然后你无法解决它。

您需要挑战延迟加载,或者做一些事情以先发制人地高效地加载 (即不是每个项目 - n + 1是残酷的)。

创建10k对象并从存在的中填充应该是非常即时的(只要实现不做任何愚蠢的事情)。这不是问题,并且盯着那样做的代码:无济于事。