【问题标题】:Something is slow in my code, any suggestions?我的代码有些慢,有什么建议吗?
【发布时间】:2018-12-13 18:53:42
【问题描述】:

我有一个大记录列表,我需要遍历每条记录,添加一些过滤器和计算并将其添加到我的另一个列表中。我认为逐条执行会影响性能,因为显示 900 条记录大约需要 12 秒。

我无法确定为什么花费的时间太长。我使用我的 chrome 开发人员工具来确定它在哪里运行缓慢。后来发现loading 0.2s,scripting 3s,rendering 3s,idle 3s,其他2s。

也许我正在使用实体框架,而 DataTables 让它变慢了。或者我的查询可能有问题。以下是我的代码:

public ActionResult Index(int id, string language)
{
 var All_Employees = from employee in db.Employees
                     .Include(x => x.Country).Include(x => x.Status)
                     where enployee.GenderId == id
                     select employee ;

 var List = new List<EmployeeListViewModel>();

 foreach(var Record in All_Employees.ToList()
         .OrderByDescending(x=> ParseDate(x.JoiningDate)))
 {
      EmployeeListViewModel item = new EmployeeListViewModel();
      item.Id = Record.Id;
      item.Code = Record.Code;
      if(Record.CountryId != null)
      {
          if(language == "en")
          {
             item.Country = Record.Country.NameE;
          }
          else
          {
             item.Country = Record.Country.NameA;
          }
      }

      item.Date = Record.JoiningDate;
      int WorkingDays = 0;
      if(Record.JoiningDate != null)
      {
        DateTime Joining= Convert.ToDateTime(ParseDate(Record.Record.JoiningDate));

        TimeSpan t = DateTime.Now.Date - Joining;
        int Days = int.Parse(t.TotalDays.ToString());
        if (Days > 0)
        {
            WorkingDays = Days;
        }
      }
      item.Days = WorkingDays.ToString();

      if (Record.StatusId != null)
      {
         if (language == "en")
         {
            item.Status = Record.Status.NameE;
         }
         else
         {
            item.Status = Record.Status.NameE;
         }
      }

     List.Add(item);
 }
 return View(List);
}

另一个原因可能是我正在转换我的日期:

private static DateTime? ParseDate(string dateString)
{
   if(dateString != null)
   {
     return DateTime.ParseExact(dateString, "dd-MM-yyyy", CultureInfo.GetCultureInfo("en-US"), DateTimeStyles.None);
   }
   else
   {
     return null;
   }           
}

由于某些原因,我不想在我的数据库中将日期归档为 DateTime。

在我目前的情况下,提高性能的最佳方法是什么?

【问题讨论】:

  • 另一个原因可能是我正在转换我的日期: -- 好吧,验证一下。尝试不进行此转换。
  • @GertArnold 我试过了,但仍然需要大约相同的时间。
  • Add v.s AddRange 极不可能对这种数字产生任何明显的影响。你必须一步一步地消除这个,这是只有你能做的事情。这使您的问题相当广泛:“我的代码中有些地方很慢,有什么建议吗?
  • 亲爱的,感谢您的建议。我正在更改我的问题的标题。你有什么建议吗?
  • 好吧,我想告诉你,这种形式的问题在 Stack Overflow 上是题外话因为它太宽泛了。你自己必须一步一步消除这个。

标签: asp.net-mvc performance entity-framework linq


【解决方案1】:

在您的代码中使用了过多的转换,并且列表被创建了两次。一种可以执行如下代码的方法。

 List<EmployeeListViewModel> lstData = EmployeeListViewModel.ToList();
 for(int i = 0; i < lstData.Count; i++)
 {
     //Put logic here for required changes like Language and Date.
     if(lstData[i].CountryId != null)
     {
          if(language == "en")
             lstData[i].Country = lstData[i].Country.NameE;
          else
             lstData[i].Country = lstData[i].Country.NameA;
      }
 }

尝试减少专门针对字符串和日期时间的转换。下面是例子。

int Days = int.Parse(t.TotalDays.ToString());

在上面的行中,t.TotalDays 始终是 int 类型,无需再次转换为 string 和 int。

【讨论】:

  • 亲爱的,我正在填写来自“All_Employees”的EmlployeeListViewModel。我需要将字符串日期转换为日期时间,因为我需要按日期排序。如何改进我的代码以使其更快?
  • 对不起,这没有意义。一方面,lstData 是什么?然后,您继续访问索引器lstData[i],而这应该只进行一次。最后,lstData[i].Country = lstData[i].Country.NameE 甚至无法编译。
  • 以上代码无法编译,因为它只是示例如何最小化代码行。但是,一旦您拥有 EmlployeeListViewModel 列表,您就可以根据需要对其进行管理。如果提供的值错误,TryParse 实际上会在内部引发异常。这会降低应用程序的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多